diff for duplicates of <670e4bd2c9d8dc91d1c9fca2b050915942b2a9b2.camel@intel.com> diff --git a/a/1.txt b/N1/1.txt index e66cdfe..fd8617e 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -5,82 +5,82 @@ On Mon, 2021-12-06 at 05:27 +0000, Billy Tsai wrote: > reply inline. > > On 2021/11/23, 10:11 PM, "openbmc on behalf of Iwona Winiarska" -> <openbmc-bounces+billy_tsai=aspeedtech.com@lists.ozlabs.org?on behalf of -> iwona.winiarska at intel.com> wrote: +> <openbmc-bounces+billy_tsai=aspeedtech.com@lists.ozlabs.org on behalf of +> iwona.winiarska@intel.com> wrote: > -> ??? >?? From: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com> +> > From: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com> > Add the define for the bus frequency -> ??????? #define ASPEED_PECI_BUS_FREQUENCY_MIN???????????2000 -> ??????? #define ASPEED_PECI_BUS_FREQUENCY_DEFAULT???????2000 -> ??????? #define ASPEED_PECI_BUS_FREQUENCY_MAX???????????1000000 +> #define ASPEED_PECI_BUS_FREQUENCY_MIN 2000 +> #define ASPEED_PECI_BUS_FREQUENCY_DEFAULT 2000 +> #define ASPEED_PECI_BUS_FREQUENCY_MAX 1000000 > -> ?? >?? +struct aspeed_peci { -> ??? >?? +???????struct peci_controller *controller; -> ??? >?? +???????struct device *dev; -> ??? >?? +???????void __iomem *base; -> ??? >?? +???????struct clk *clk; -> ??? >?? +???????struct reset_control *rst; -> ??? >?? +???????int irq; -> ??? >?? +???????spinlock_t lock; /* to sync completion status handling */ -> ??? >?? +???????struct completion xfer_complete; -> ??? >?? +???????u32 status; -> ??? >?? +???????u32 cmd_timeout_ms; -> ??? >?? +???????u32 msg_timing; -> ??? >?? +???????u32 addr_timing; -> ??? >?? +???????u32 rd_sampling_point; -> ??? >?? +???????u32 clk_div; +> > +struct aspeed_peci { +> > + struct peci_controller *controller; +> > + struct device *dev; +> > + void __iomem *base; +> > + struct clk *clk; +> > + struct reset_control *rst; +> > + int irq; +> > + spinlock_t lock; /* to sync completion status handling */ +> > + struct completion xfer_complete; +> > + u32 status; +> > + u32 cmd_timeout_ms; +> > + u32 msg_timing; +> > + u32 addr_timing; +> > + u32 rd_sampling_point; +> > + u32 clk_div; > > Add the paremeter to store the bus_freq from the dts property -> ??????? u32 bus_freq; +> u32 bus_freq; > -> ??? >?? +}; -> ??? >?? + -> ??? >?? +static void aspeed_peci_init_regs(struct aspeed_peci *priv) -> ??? >?? +{ -> ??? >?? +???????u32 val; -> ??? >?? + -> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, +> > +}; +> > + +> > +static void aspeed_peci_init_regs(struct aspeed_peci *priv) +> > +{ +> > + u32 val; +> > + +> > + val = FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, > ASPEED_PECI_CLK_DIV_DEFAULT); -> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_CLK_EN; -> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_CTRL); -> ??? >?? +???????/* -> ??? >?? +??????? * Timing negotiation period setting. -> ??? >?? +??????? * The unit of the programmed value is 4 times of PECI clock +> > + val |= ASPEED_PECI_CTRL_PECI_CLK_EN; +> > + writel(val, priv->base + ASPEED_PECI_CTRL); +> > + /* +> > + * Timing negotiation period setting. +> > + * The unit of the programmed value is 4 times of PECI clock > period. -> ??? >?? +??????? */ -> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_T_NEGO_MSG_MASK, priv- +> > + */ +> > + val = FIELD_PREP(ASPEED_PECI_T_NEGO_MSG_MASK, priv- > >msg_timing); -> ??? >?? +???????val |= FIELD_PREP(ASPEED_PECI_T_NEGO_ADDR_MASK, priv- +> > + val |= FIELD_PREP(ASPEED_PECI_T_NEGO_ADDR_MASK, priv- > >addr_timing); -> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_TIMING_NEGOTIATION); -> ??? >?? + -> ??? >?? +???????/* Clear interrupts */ -> ??? >?? +???????val = readl(priv->base + ASPEED_PECI_INT_STS) | +> > + writel(val, priv->base + ASPEED_PECI_TIMING_NEGOTIATION); +> > + +> > + /* Clear interrupts */ +> > + val = readl(priv->base + ASPEED_PECI_INT_STS) | > ASPEED_PECI_INT_MASK; -> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_INT_STS); -> ??? >?? + -> ??? >?? +???????/* Set timing negotiation mode and enable interrupts */ -> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_TIMING_NEGO_SEL_MASK, +> > + writel(val, priv->base + ASPEED_PECI_INT_STS); +> > + +> > + /* Set timing negotiation mode and enable interrupts */ +> > + val = FIELD_PREP(ASPEED_PECI_TIMING_NEGO_SEL_MASK, > ASPEED_PECI_1ST_BIT_OF_ADDR_NEGO); -> ??? >?? +???????val |= ASPEED_PECI_INT_MASK; -> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_INT_CTRL); -> ??? >?? + -> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_CTRL_SAMPLING_MASK, priv- +> > + val |= ASPEED_PECI_INT_MASK; +> > + writel(val, priv->base + ASPEED_PECI_INT_CTRL); +> > + +> > + val = FIELD_PREP(ASPEED_PECI_CTRL_SAMPLING_MASK, priv- > >rd_sampling_point); -> ??? >?? +???????val |= FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, priv- +> > + val |= FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, priv- > >clk_div); -> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_EN; -> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_CLK_EN; -> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_CTRL); -> ??? >?? +} -> ??? >?? + -> ??? >?? +static inline int aspeed_peci_check_idle(struct aspeed_peci *priv) -> ??? >?? +{ -> ??? >?? +???????u32 cmd_sts = readl(priv->base + ASPEED_PECI_CMD); -> ??? >?? + -> ??? >?? +???????if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts) == +> > + val |= ASPEED_PECI_CTRL_PECI_EN; +> > + val |= ASPEED_PECI_CTRL_PECI_CLK_EN; +> > + writel(val, priv->base + ASPEED_PECI_CTRL); +> > +} +> > + +> > +static inline int aspeed_peci_check_idle(struct aspeed_peci *priv) +> > +{ +> > + u32 cmd_sts = readl(priv->base + ASPEED_PECI_CMD); +> > + +> > + if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts) == > ASPEED_PECI_CMD_STS_ADDR_T_NEGO) -> ??? >?? +???????????????aspeed_peci_init_regs(priv); +> > + aspeed_peci_init_regs(priv); > > As long as the state is not idle, the controller need to reinitialize the PECI > register for solving the PECI controller hang. @@ -88,11 +88,11 @@ On Mon, 2021-12-06 at 05:27 +0000, Billy Tsai wrote: > the hang issue. > For backward compatible, I suggest to add the reset assert/de-assert in this > place. -> ??????? if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts)) { -> ??????????????????????? reset_control_assert(priv->rst); -> ??????????????????????? reset_control_deassert(priv->rst); -> ??????????????????????? aspeed_peci_init_regs(priv); -> ??????? } +> if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts)) { +> reset_control_assert(priv->rst); +> reset_control_deassert(priv->rst); +> aspeed_peci_init_regs(priv); +> } Ack. @@ -100,42 +100,42 @@ Ack. (...) -> ??? >?? +static void aspeed_peci_property_setup(struct aspeed_peci *priv) -> ??? >?? +{ -> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, "aspeed,clock- +> > +static void aspeed_peci_property_setup(struct aspeed_peci *priv) +> > +{ +> > + aspeed_peci_property_sanitize(priv->dev, "aspeed,clock- > divider", -> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_CLK_DIV_MAX, -> ??? >?? +???????????????????????????????????? ASPEED_PECI_CLK_DIV_DEFAULT, +> > + 0, ASPEED_PECI_CLK_DIV_MAX, +> > + ASPEED_PECI_CLK_DIV_DEFAULT, > &priv->clk_div); -> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, "aspeed,msg-timing", -> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_MSG_TIMING_MAX, -> ??? >?? +???????????????????????????????????? ASPEED_PECI_MSG_TIMING_DEFAULT, +> > + aspeed_peci_property_sanitize(priv->dev, "aspeed,msg-timing", +> > + 0, ASPEED_PECI_MSG_TIMING_MAX, +> > + ASPEED_PECI_MSG_TIMING_DEFAULT, > &priv->msg_timing); -> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, "aspeed,addr-timing", -> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_ADDR_TIMING_MAX, -> ??? >?? +???????????????????????????????????? ASPEED_PECI_ADDR_TIMING_DEFAULT, +> > + aspeed_peci_property_sanitize(priv->dev, "aspeed,addr-timing", +> > + 0, ASPEED_PECI_ADDR_TIMING_MAX, +> > + ASPEED_PECI_ADDR_TIMING_DEFAULT, > &priv->addr_timing); > > Use the bus-frequency to replace the property above: -> ??????? aspeed_peci_property_sanitize(priv->dev, "bus-frequency", -> ????????????????????????????????ASPEED_PECI_BUS_FREQUENCY_MIN, +> aspeed_peci_property_sanitize(priv->dev, "bus-frequency", +> ASPEED_PECI_BUS_FREQUENCY_MIN, > ASPEED_PECI_BUS_FREQUENCY_MAX, -> ????????????????????????????????ASPEED_PECI_BUS_FREQUENCY_DEFAULT, &priv- +> ASPEED_PECI_BUS_FREQUENCY_DEFAULT, &priv- > >bus_freq); > -> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, "aspeed,rd-sampling- +> > + aspeed_peci_property_sanitize(priv->dev, "aspeed,rd-sampling- > point", -> ??? >?? +???????????????????????????????????? 0, +> > + 0, > ASPEED_PECI_RD_SAMPLING_POINT_MAX, -> ??? >?? +???????????????????????????????????? +> > + > ASPEED_PECI_RD_SAMPLING_POINT_DEFAULT, -> ??? >?? +???????????????????????????????????? &priv->rd_sampling_point); -> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, "cmd-timeout-ms", -> ??? >?? +???????????????????????????????????? 1, +> > + &priv->rd_sampling_point); +> > + aspeed_peci_property_sanitize(priv->dev, "cmd-timeout-ms", +> > + 1, > ASPEED_PECI_CMD_TIMEOUT_MS_MAX, -> ??? >?? +???????????????????????????????????? +> > + > ASPEED_PECI_CMD_TIMEOUT_MS_DEFAULT, &priv->cmd_timeout_ms); -> ??? >?? +} +> > +} > Add the function of automatically calculating the settings to adapt to the bus > frequency. @@ -149,173 +149,173 @@ presenting this as what it actually is (a "custom" clock divider). Thanks -Iwona -> ??????? static void aspeed_peci_bus_freq_setup(struct aspeed_peci *priv) -> ??????? { -> ??????????????? unsigned long src_clk_rate; -> ??????????????? int delta_value, delta_tmp, clk_divisor, clk_divisor_tmp; -> ??????????????? u32 msg_timing, clk_div; +> static void aspeed_peci_bus_freq_setup(struct aspeed_peci *priv) +> { +> unsigned long src_clk_rate; +> int delta_value, delta_tmp, clk_divisor, clk_divisor_tmp; +> u32 msg_timing, clk_div; > -> ??????????????? src_clk_rate = clk_get_rate(priv->clk); +> src_clk_rate = clk_get_rate(priv->clk); > -> ??????????????? /* -> ???????????????? * PECI bus freq? = (source clk rate) / (4 * +> /* +> * PECI bus freq = (source clk rate) / (4 * > (PECI04[15:8]*4+1) * (1 << PECI00[10:8])) -> ???????????????? * (1 << PECI00[10:8]) * (PECI04[15:8]*4+1) = (source clk +> * (1 << PECI00[10:8]) * (PECI04[15:8]*4+1) = (source clk > rate) / (4 * PECI bus freq ) -> ???????????????? */ -> ??????????????? clk_divisor = src_clk_rate / (4 * priv->bus_freq); -> ??????????????? delta_value = clk_divisor; -> ??????????????? /* Find the closest divisor for bus-frequency */ -> ??????????????? for (msg_timing = 1; msg_timing <= 255; msg_timing++) -> ??????????????????????? for (clk_div = 0; clk_div < 7; -> ??????????????????????????????? clk_div++) { -> ??????????????????????????????? clk_divisor_tmp = (1 << clk_div) * -> ??????????????????????????????????????????????? (msg_timing * 4 + 1); -> ??????????????????????????????? delta_tmp = abs(clk_divisor - +> */ +> clk_divisor = src_clk_rate / (4 * priv->bus_freq); +> delta_value = clk_divisor; +> /* Find the closest divisor for bus-frequency */ +> for (msg_timing = 1; msg_timing <= 255; msg_timing++) +> for (clk_div = 0; clk_div < 7; +> clk_div++) { +> clk_divisor_tmp = (1 << clk_div) * +> (msg_timing * 4 + 1); +> delta_tmp = abs(clk_divisor - > clk_divisor_tmp); -> ??????????????????????????????? if (delta_tmp < delta_value) { -> ??????????????????????????????????????? delta_value = delta_tmp; -> ??????????????????????????????????????? priv->msg_timing = msg_timing; -> ??????????????????????????????????????? priv->addr_timing = priv->msg_timing; -> ??????????????????????????????????????? priv->clk_div = clk_div; -> ??????????????????????????????? } -> ??????????????????????? } -> ??????? } +> if (delta_tmp < delta_value) { +> delta_value = delta_tmp; +> priv->msg_timing = msg_timing; +> priv->addr_timing = priv->msg_timing; +> priv->clk_div = clk_div; +> } +> } +> } > -> ??? >?? + -> ??? >?? +static struct peci_controller_ops aspeed_ops = { -> ??? >?? +???????.xfer = aspeed_peci_xfer, -> ??? >?? +}; -> ??? >?? + -> ??? >?? +static void aspeed_peci_reset_control_release(void *data) -> ??? >?? +{ -> ??? >?? +???????reset_control_assert(data); -> ??? >?? +} -> ??? >?? + -> ??? >?? +static int devm_aspeed_peci_reset_control_deassert(struct device +> > + +> > +static struct peci_controller_ops aspeed_ops = { +> > + .xfer = aspeed_peci_xfer, +> > +}; +> > + +> > +static void aspeed_peci_reset_control_release(void *data) +> > +{ +> > + reset_control_assert(data); +> > +} +> > + +> > +static int devm_aspeed_peci_reset_control_deassert(struct device > *dev, struct reset_control *rst) -> ??? >?? +{ -> ??? >?? +???????int ret; -> ??? >?? + -> ??? >?? +???????ret = reset_control_deassert(rst); -> ??? >?? +???????if (ret) -> ??? >?? +???????????????return ret; -> ??? >?? + -> ??? >?? +???????return devm_add_action_or_reset(dev, +> > +{ +> > + int ret; +> > + +> > + ret = reset_control_deassert(rst); +> > + if (ret) +> > + return ret; +> > + +> > + return devm_add_action_or_reset(dev, > aspeed_peci_reset_control_release, rst); -> ??? >?? +} -> ??? >?? + -> ??? >?? +static void aspeed_peci_clk_release(void *data) -> ??? >?? +{ -> ??? >?? +???????clk_disable_unprepare(data); -> ??? >?? +} -> ??? >?? + -> ??? >?? +static int devm_aspeed_peci_clk_enable(struct device *dev, struct clk +> > +} +> > + +> > +static void aspeed_peci_clk_release(void *data) +> > +{ +> > + clk_disable_unprepare(data); +> > +} +> > + +> > +static int devm_aspeed_peci_clk_enable(struct device *dev, struct clk > *clk) -> ??? >?? +{ -> ??? >?? +???????int ret; -> ??? >?? + -> ??? >?? +???????ret = clk_prepare_enable(clk); -> ??? >?? +???????if (ret) -> ??? >?? +???????????????return ret; -> ??? >?? + -> ??? >?? +???????return devm_add_action_or_reset(dev, aspeed_peci_clk_release, +> > +{ +> > + int ret; +> > + +> > + ret = clk_prepare_enable(clk); +> > + if (ret) +> > + return ret; +> > + +> > + return devm_add_action_or_reset(dev, aspeed_peci_clk_release, > clk); -> ??? >?? +} -> ??? >?? + -> ??? >?? +static int aspeed_peci_probe(struct platform_device *pdev) -> ??? >?? +{ -> ??? >?? +???????struct peci_controller *controller; -> ??? >?? +???????struct aspeed_peci *priv; -> ??? >?? +???????int ret; -> ??? >?? + -> ??? >?? +???????priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); -> ??? >?? +???????if (!priv) -> ??? >?? +???????????????return -ENOMEM; -> ??? >?? + -> ??? >?? +???????priv->dev = &pdev->dev; -> ??? >?? +???????dev_set_drvdata(priv->dev, priv); -> ??? >?? + -> ??? >?? +???????priv->base = devm_platform_ioremap_resource(pdev, 0); -> ??? >?? +???????if (IS_ERR(priv->base)) -> ??? >?? +???????????????return PTR_ERR(priv->base); -> ??? >?? + -> ??? >?? +???????priv->irq = platform_get_irq(pdev, 0); -> ??? >?? +???????if (!priv->irq) -> ??? >?? +???????????????return priv->irq; -> ??? >?? + -> ??? >?? +???????ret = devm_request_irq(&pdev->dev, priv->irq, +> > +} +> > + +> > +static int aspeed_peci_probe(struct platform_device *pdev) +> > +{ +> > + struct peci_controller *controller; +> > + struct aspeed_peci *priv; +> > + int ret; +> > + +> > + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); +> > + if (!priv) +> > + return -ENOMEM; +> > + +> > + priv->dev = &pdev->dev; +> > + dev_set_drvdata(priv->dev, priv); +> > + +> > + priv->base = devm_platform_ioremap_resource(pdev, 0); +> > + if (IS_ERR(priv->base)) +> > + return PTR_ERR(priv->base); +> > + +> > + priv->irq = platform_get_irq(pdev, 0); +> > + if (!priv->irq) +> > + return priv->irq; +> > + +> > + ret = devm_request_irq(&pdev->dev, priv->irq, > aspeed_peci_irq_handler, -> ??? >?? +????????????????????????????? 0, "peci-aspeed", priv); -> ??? >?? +???????if (ret) -> ??? >?? +???????????????return ret; -> ??? >?? + -> ??? >?? +???????init_completion(&priv->xfer_complete); -> ??? >?? +???????spin_lock_init(&priv->lock); -> ??? >?? + -> ??? >?? +???????priv->rst = devm_reset_control_get(&pdev->dev, NULL); -> ??? >?? +???????if (IS_ERR(priv->rst)) -> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(priv->rst), -> ??? >?? +??????????????????????????????????? "failed to get reset control\n"); -> ??? >?? + -> ??? >?? +???????ret = devm_aspeed_peci_reset_control_deassert(priv->dev, priv- +> > + 0, "peci-aspeed", priv); +> > + if (ret) +> > + return ret; +> > + +> > + init_completion(&priv->xfer_complete); +> > + spin_lock_init(&priv->lock); +> > + +> > + priv->rst = devm_reset_control_get(&pdev->dev, NULL); +> > + if (IS_ERR(priv->rst)) +> > + return dev_err_probe(priv->dev, PTR_ERR(priv->rst), +> > + "failed to get reset control\n"); +> > + +> > + ret = devm_aspeed_peci_reset_control_deassert(priv->dev, priv- > >rst); -> ??? >?? +???????if (ret) -> ??? >?? +???????????????return dev_err_probe(priv->dev, ret, "cannot deassert +> > + if (ret) +> > + return dev_err_probe(priv->dev, ret, "cannot deassert > reset control\n"); -> ??? >?? + -> ??? >?? +???????priv->clk = devm_clk_get(priv->dev, NULL); -> ??? >?? +???????if (IS_ERR(priv->clk)) -> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(priv->clk), +> > + +> > + priv->clk = devm_clk_get(priv->dev, NULL); +> > + if (IS_ERR(priv->clk)) +> > + return dev_err_probe(priv->dev, PTR_ERR(priv->clk), > "failed to get clk\n"); -> ??? >?? + -> ??? >?? +???????ret = devm_aspeed_peci_clk_enable(priv->dev, priv->clk); -> ??? >?? +???????if (ret) -> ??? >?? +???????????????return dev_err_probe(priv->dev, ret, "failed to enable +> > + +> > + ret = devm_aspeed_peci_clk_enable(priv->dev, priv->clk); +> > + if (ret) +> > + return dev_err_probe(priv->dev, ret, "failed to enable > clock\n"); -> ??? >?? + -> ??? >?? +???????aspeed_peci_property_setup(priv); +> > + +> > + aspeed_peci_property_setup(priv); > -> ??????? aspeed_peci_bus_freq_setup(priv); +> aspeed_peci_bus_freq_setup(priv); > -> ??? >?? + -> ??? >?? +???????aspeed_peci_init_regs(priv); -> ??? >?? + -> ??? >?? +???????controller = devm_peci_controller_add(priv->dev, &aspeed_ops); -> ??? >?? +???????if (IS_ERR(controller)) -> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(controller), -> ??? >?? +??????????????????????????????????? "failed to add aspeed peci +> > + +> > + aspeed_peci_init_regs(priv); +> > + +> > + controller = devm_peci_controller_add(priv->dev, &aspeed_ops); +> > + if (IS_ERR(controller)) +> > + return dev_err_probe(priv->dev, PTR_ERR(controller), +> > + "failed to add aspeed peci > controller\n"); -> ??? >?? + -> ??? >?? +???????priv->controller = controller; -> ??? >?? + -> ??? >?? +???????return 0; -> ??? >?? +} -> ??? >?? + -> ??? >?? +static const struct of_device_id aspeed_peci_of_table[] = { -> ??? >?? +???????{ .compatible = "aspeed,ast2400-peci", }, -> ??? >?? +???????{ .compatible = "aspeed,ast2500-peci", }, -> ??? >?? +???????{ .compatible = "aspeed,ast2600-peci", }, -> ??? >?? +???????{ } -> ??? >?? +}; -> ??? >?? +MODULE_DEVICE_TABLE(of, aspeed_peci_of_table); -> ??? >?? + -> ??? >?? +static struct platform_driver aspeed_peci_driver = { -> ??? >?? +???????.probe? = aspeed_peci_probe, -> ??? >?? +???????.driver = { -> ??? >?? +???????????????.name?????????? = "peci-aspeed", -> ??? >?? +???????????????.of_match_table = aspeed_peci_of_table, -> ??? >?? +???????}, -> ??? >?? +}; -> ??? >?? +module_platform_driver(aspeed_peci_driver); -> ??? >?? + -> ??? >?? +MODULE_AUTHOR("Ryan Chen <ryan_chen@aspeedtech.com>"); -> ??? >?? +MODULE_AUTHOR("Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>"); -> ??? >?? +MODULE_DESCRIPTION("ASPEED PECI driver"); -> ??? >?? +MODULE_LICENSE("GPL"); -> ??? >?? +MODULE_IMPORT_NS(PECI); -> ??? >?? -- -> ??? >?? 2.31.1 +> > + +> > + priv->controller = controller; +> > + +> > + return 0; +> > +} +> > + +> > +static const struct of_device_id aspeed_peci_of_table[] = { +> > + { .compatible = "aspeed,ast2400-peci", }, +> > + { .compatible = "aspeed,ast2500-peci", }, +> > + { .compatible = "aspeed,ast2600-peci", }, +> > + { } +> > +}; +> > +MODULE_DEVICE_TABLE(of, aspeed_peci_of_table); +> > + +> > +static struct platform_driver aspeed_peci_driver = { +> > + .probe = aspeed_peci_probe, +> > + .driver = { +> > + .name = "peci-aspeed", +> > + .of_match_table = aspeed_peci_of_table, +> > + }, +> > +}; +> > +module_platform_driver(aspeed_peci_driver); +> > + +> > +MODULE_AUTHOR("Ryan Chen <ryan_chen@aspeedtech.com>"); +> > +MODULE_AUTHOR("Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>"); +> > +MODULE_DESCRIPTION("ASPEED PECI driver"); +> > +MODULE_LICENSE("GPL"); +> > +MODULE_IMPORT_NS(PECI); +> > -- +> > 2.31.1 > > > diff --git a/a/content_digest b/N1/content_digest index c3e1dab..bf86cf6 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -2,9 +2,36 @@ "ref\020211123140706.2945700-6-iwona.winiarska@intel.com\0" "ref\071D27F36-8BB7-4C30-99C5-CCA4F9A30945@aspeedtech.com\0" "From\0Winiarska, Iwona <iwona.winiarska@intel.com>\0" - "Subject\0[PATCH v4 05/13] peci: Add peci-aspeed controller driver\0" + "Subject\0Re: [PATCH v4 05/13] peci: Add peci-aspeed controller driver\0" "Date\0Tue, 7 Dec 2021 18:09:36 +0000\0" - "To\0linux-aspeed@lists.ozlabs.org\0" + "To\0billy_tsai@aspeedtech.com <billy_tsai@aspeedtech.com>" + gregkh@linuxfoundation.org <gregkh@linuxfoundation.org> + linux-kernel@vger.kernel.org <linux-kernel@vger.kernel.org> + " openbmc@lists.ozlabs.org <openbmc@lists.ozlabs.org>\0" + "Cc\0corbet@lwn.net <corbet@lwn.net>" + jae.hyun.yoo@linux.intel.com <jae.hyun.yoo@linux.intel.com> + linux-hwmon@vger.kernel.org <linux-hwmon@vger.kernel.org> + andrew@aj.id.au <andrew@aj.id.au> + Hansen + Dave <dave.hansen@intel.com> + Luck + Tony <tony.luck@intel.com> + jdelvare@suse.com <jdelvare@suse.com> + olof@lixom.net <olof@lixom.net> + rdunlap@infradead.org <rdunlap@infradead.org> + devicetree@vger.kernel.org <devicetree@vger.kernel.org> + linux-aspeed@lists.ozlabs.org <linux-aspeed@lists.ozlabs.org> + linux@roeck-us.net <linux@roeck-us.net> + arnd@arndb.de <arnd@arndb.de> + linux-doc@vger.kernel.org <linux-doc@vger.kernel.org> + robh+dt@kernel.org <robh+dt@kernel.org> + zweiss@equinix.com <zweiss@equinix.com> + bp@alien8.de <bp@alien8.de> + linux-arm-kernel@lists.infradead.org <linux-arm-kernel@lists.infradead.org> + pierre-louis.bossart@linux.intel.com <pierre-louis.bossart@linux.intel.com> + andriy.shevchenko@linux.intel.com <andriy.shevchenko@linux.intel.com> + Williams + " Dan J <dan.j.williams@intel.com>\0" "\00:1\0" "b\0" "On Mon, 2021-12-06 at 05:27 +0000, Billy Tsai wrote:\n" @@ -14,82 +41,82 @@ "> reply inline.\n" "> \n" "> On 2021/11/23, 10:11 PM, \"openbmc on behalf of Iwona Winiarska\"\n" - "> <openbmc-bounces+billy_tsai=aspeedtech.com@lists.ozlabs.org?on behalf of\n" - "> iwona.winiarska at intel.com> wrote:\n" + "> <openbmc-bounces+billy_tsai=aspeedtech.com@lists.ozlabs.org\302\240on behalf of\n" + "> iwona.winiarska@intel.com> wrote:\n" "> \n" - "> ??? >?? From: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>\n" + "> \302\240\302\240\302\240 >\302\240\302\240 From: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>\n" "> Add the define for the bus frequency\n" - "> ??????? #define ASPEED_PECI_BUS_FREQUENCY_MIN???????????2000\n" - "> ??????? #define ASPEED_PECI_BUS_FREQUENCY_DEFAULT???????2000\n" - "> ??????? #define ASPEED_PECI_BUS_FREQUENCY_MAX???????????1000000\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 #define ASPEED_PECI_BUS_FREQUENCY_MIN\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2402000\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 #define ASPEED_PECI_BUS_FREQUENCY_DEFAULT\302\240\302\240\302\240\302\240\302\240\302\240\302\2402000\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 #define ASPEED_PECI_BUS_FREQUENCY_MAX\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2401000000\n" "> \n" - "> ?? >?? +struct aspeed_peci {\n" - "> ??? >?? +???????struct peci_controller *controller;\n" - "> ??? >?? +???????struct device *dev;\n" - "> ??? >?? +???????void __iomem *base;\n" - "> ??? >?? +???????struct clk *clk;\n" - "> ??? >?? +???????struct reset_control *rst;\n" - "> ??? >?? +???????int irq;\n" - "> ??? >?? +???????spinlock_t lock; /* to sync completion status handling */\n" - "> ??? >?? +???????struct completion xfer_complete;\n" - "> ??? >?? +???????u32 status;\n" - "> ??? >?? +???????u32 cmd_timeout_ms;\n" - "> ??? >?? +???????u32 msg_timing;\n" - "> ??? >?? +???????u32 addr_timing;\n" - "> ??? >?? +???????u32 rd_sampling_point;\n" - "> ??? >?? +???????u32 clk_div;\n" + "> \302\240\302\240 >\302\240\302\240 +struct aspeed_peci {\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_controller *controller;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct device *dev;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240void __iomem *base;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct clk *clk;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct reset_control *rst;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int irq;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240spinlock_t lock; /* to sync completion status handling */\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct completion xfer_complete;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 status;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 cmd_timeout_ms;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 msg_timing;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 addr_timing;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 rd_sampling_point;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 clk_div;\n" "> \n" "> Add the paremeter to store the bus_freq from the dts property\n" - "> ??????? u32 bus_freq;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 u32 bus_freq;\n" "> \n" - "> ??? >?? +};\n" - "> ??? >?? +\n" - "> ??? >?? +static void aspeed_peci_init_regs(struct aspeed_peci *priv)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????u32 val;\n" - "> ??? >?? +\n" - "> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +};\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static void aspeed_peci_init_regs(struct aspeed_peci *priv)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 val;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val = FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK,\n" "> ASPEED_PECI_CLK_DIV_DEFAULT);\n" - "> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_CLK_EN;\n" - "> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_CTRL);\n" - "> ??? >?? +???????/*\n" - "> ??? >?? +??????? * Timing negotiation period setting.\n" - "> ??? >?? +??????? * The unit of the programmed value is 4 times of PECI clock\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= ASPEED_PECI_CTRL_PECI_CLK_EN;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240writel(val, priv->base + ASPEED_PECI_CTRL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240/*\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240 * Timing negotiation period setting.\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240 * The unit of the programmed value is 4 times of PECI clock\n" "> period.\n" - "> ??? >?? +??????? */\n" - "> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_T_NEGO_MSG_MASK, priv-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240 */\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val = FIELD_PREP(ASPEED_PECI_T_NEGO_MSG_MASK, priv-\n" "> >msg_timing);\n" - "> ??? >?? +???????val |= FIELD_PREP(ASPEED_PECI_T_NEGO_ADDR_MASK, priv-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= FIELD_PREP(ASPEED_PECI_T_NEGO_ADDR_MASK, priv-\n" "> >addr_timing);\n" - "> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_TIMING_NEGOTIATION);\n" - "> ??? >?? +\n" - "> ??? >?? +???????/* Clear interrupts */\n" - "> ??? >?? +???????val = readl(priv->base + ASPEED_PECI_INT_STS) |\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240writel(val, priv->base + ASPEED_PECI_TIMING_NEGOTIATION);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240/* Clear interrupts */\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val = readl(priv->base + ASPEED_PECI_INT_STS) |\n" "> ASPEED_PECI_INT_MASK;\n" - "> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_INT_STS);\n" - "> ??? >?? +\n" - "> ??? >?? +???????/* Set timing negotiation mode and enable interrupts */\n" - "> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_TIMING_NEGO_SEL_MASK,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240writel(val, priv->base + ASPEED_PECI_INT_STS);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240/* Set timing negotiation mode and enable interrupts */\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val = FIELD_PREP(ASPEED_PECI_TIMING_NEGO_SEL_MASK,\n" "> ASPEED_PECI_1ST_BIT_OF_ADDR_NEGO);\n" - "> ??? >?? +???????val |= ASPEED_PECI_INT_MASK;\n" - "> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_INT_CTRL);\n" - "> ??? >?? +\n" - "> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_CTRL_SAMPLING_MASK, priv-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= ASPEED_PECI_INT_MASK;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240writel(val, priv->base + ASPEED_PECI_INT_CTRL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val = FIELD_PREP(ASPEED_PECI_CTRL_SAMPLING_MASK, priv-\n" "> >rd_sampling_point);\n" - "> ??? >?? +???????val |= FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, priv-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, priv-\n" "> >clk_div);\n" - "> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_EN;\n" - "> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_CLK_EN;\n" - "> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_CTRL);\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static inline int aspeed_peci_check_idle(struct aspeed_peci *priv)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????u32 cmd_sts = readl(priv->base + ASPEED_PECI_CMD);\n" - "> ??? >?? +\n" - "> ??? >?? +???????if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts) ==\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= ASPEED_PECI_CTRL_PECI_EN;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= ASPEED_PECI_CTRL_PECI_CLK_EN;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240writel(val, priv->base + ASPEED_PECI_CTRL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static inline int aspeed_peci_check_idle(struct aspeed_peci *priv)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 cmd_sts = readl(priv->base + ASPEED_PECI_CMD);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts) ==\n" "> ASPEED_PECI_CMD_STS_ADDR_T_NEGO)\n" - "> ??? >?? +???????????????aspeed_peci_init_regs(priv);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_init_regs(priv);\n" "> \n" "> As long as the state is not idle, the controller need to reinitialize the PECI\n" "> register for solving the PECI controller hang.\n" @@ -97,11 +124,11 @@ "> the hang issue.\n" "> For backward compatible, I suggest to add the reset assert/de-assert in this\n" "> place.\n" - "> ??????? if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts)) {\n" - "> ??????????????????????? reset_control_assert(priv->rst);\n" - "> ??????????????????????? reset_control_deassert(priv->rst);\n" - "> ??????????????????????? aspeed_peci_init_regs(priv);\n" - "> ??????? }\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts)) {\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 reset_control_assert(priv->rst);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 reset_control_deassert(priv->rst);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 aspeed_peci_init_regs(priv);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 }\n" "\n" "Ack.\n" "\n" @@ -109,42 +136,42 @@ "\n" "(...)\n" "\n" - "> ??? >?? +static void aspeed_peci_property_setup(struct aspeed_peci *priv)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, \"aspeed,clock-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static void aspeed_peci_property_setup(struct aspeed_peci *priv)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_sanitize(priv->dev, \"aspeed,clock-\n" "> divider\",\n" - "> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_CLK_DIV_MAX,\n" - "> ??? >?? +???????????????????????????????????? ASPEED_PECI_CLK_DIV_DEFAULT,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 0, ASPEED_PECI_CLK_DIV_MAX,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 ASPEED_PECI_CLK_DIV_DEFAULT,\n" "> &priv->clk_div);\n" - "> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, \"aspeed,msg-timing\",\n" - "> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_MSG_TIMING_MAX,\n" - "> ??? >?? +???????????????????????????????????? ASPEED_PECI_MSG_TIMING_DEFAULT,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_sanitize(priv->dev, \"aspeed,msg-timing\",\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 0, ASPEED_PECI_MSG_TIMING_MAX,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 ASPEED_PECI_MSG_TIMING_DEFAULT,\n" "> &priv->msg_timing);\n" - "> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, \"aspeed,addr-timing\",\n" - "> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_ADDR_TIMING_MAX,\n" - "> ??? >?? +???????????????????????????????????? ASPEED_PECI_ADDR_TIMING_DEFAULT,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_sanitize(priv->dev, \"aspeed,addr-timing\",\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 0, ASPEED_PECI_ADDR_TIMING_MAX,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 ASPEED_PECI_ADDR_TIMING_DEFAULT,\n" "> &priv->addr_timing);\n" "> \n" "> Use the bus-frequency to replace the property above:\n" - "> ??????? aspeed_peci_property_sanitize(priv->dev, \"bus-frequency\",\n" - "> ????????????????????????????????ASPEED_PECI_BUS_FREQUENCY_MIN,\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 aspeed_peci_property_sanitize(priv->dev, \"bus-frequency\",\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ASPEED_PECI_BUS_FREQUENCY_MIN,\n" "> ASPEED_PECI_BUS_FREQUENCY_MAX,\n" - "> ????????????????????????????????ASPEED_PECI_BUS_FREQUENCY_DEFAULT, &priv-\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ASPEED_PECI_BUS_FREQUENCY_DEFAULT, &priv-\n" "> >bus_freq);\n" "> \n" - "> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, \"aspeed,rd-sampling-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_sanitize(priv->dev, \"aspeed,rd-sampling-\n" "> point\",\n" - "> ??? >?? +???????????????????????????????????? 0,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 0,\n" "> ASPEED_PECI_RD_SAMPLING_POINT_MAX,\n" - "> ??? >?? +????????????????????????????????????\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\n" "> ASPEED_PECI_RD_SAMPLING_POINT_DEFAULT,\n" - "> ??? >?? +???????????????????????????????????? &priv->rd_sampling_point);\n" - "> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, \"cmd-timeout-ms\",\n" - "> ??? >?? +???????????????????????????????????? 1,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 &priv->rd_sampling_point);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_sanitize(priv->dev, \"cmd-timeout-ms\",\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 1,\n" "> ASPEED_PECI_CMD_TIMEOUT_MS_MAX,\n" - "> ??? >?? +????????????????????????????????????\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\n" "> ASPEED_PECI_CMD_TIMEOUT_MS_DEFAULT, &priv->cmd_timeout_ms);\n" - "> ??? >?? +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" "> Add the function of automatically calculating the settings to adapt to the bus\n" "> frequency.\n" "\n" @@ -158,175 +185,175 @@ "Thanks\n" "-Iwona\n" "\n" - "> ??????? static void aspeed_peci_bus_freq_setup(struct aspeed_peci *priv)\n" - "> ??????? {\n" - "> ??????????????? unsigned long src_clk_rate;\n" - "> ??????????????? int delta_value, delta_tmp, clk_divisor, clk_divisor_tmp;\n" - "> ??????????????? u32 msg_timing, clk_div;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 static void aspeed_peci_bus_freq_setup(struct aspeed_peci *priv)\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 {\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 unsigned long src_clk_rate;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 int delta_value, delta_tmp, clk_divisor, clk_divisor_tmp;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 u32 msg_timing, clk_div;\n" "> \n" - "> ??????????????? src_clk_rate = clk_get_rate(priv->clk);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 src_clk_rate = clk_get_rate(priv->clk);\n" "> \n" - "> ??????????????? /*\n" - "> ???????????????? * PECI bus freq? = (source clk rate) / (4 *\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 /*\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 * PECI bus freq\302\240 = (source clk rate) / (4 *\n" "> (PECI04[15:8]*4+1) * (1 << PECI00[10:8]))\n" - "> ???????????????? * (1 << PECI00[10:8]) * (PECI04[15:8]*4+1) = (source clk\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 * (1 << PECI00[10:8]) * (PECI04[15:8]*4+1) = (source clk\n" "> rate) / (4 * PECI bus freq )\n" - "> ???????????????? */\n" - "> ??????????????? clk_divisor = src_clk_rate / (4 * priv->bus_freq);\n" - "> ??????????????? delta_value = clk_divisor;\n" - "> ??????????????? /* Find the closest divisor for bus-frequency */\n" - "> ??????????????? for (msg_timing = 1; msg_timing <= 255; msg_timing++)\n" - "> ??????????????????????? for (clk_div = 0; clk_div < 7;\n" - "> ??????????????????????????????? clk_div++) {\n" - "> ??????????????????????????????? clk_divisor_tmp = (1 << clk_div) *\n" - "> ??????????????????????????????????????????????? (msg_timing * 4 + 1);\n" - "> ??????????????????????????????? delta_tmp = abs(clk_divisor -\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 */\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 clk_divisor = src_clk_rate / (4 * priv->bus_freq);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 delta_value = clk_divisor;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 /* Find the closest divisor for bus-frequency */\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 for (msg_timing = 1; msg_timing <= 255; msg_timing++)\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 for (clk_div = 0; clk_div < 7;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 clk_div++) {\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 clk_divisor_tmp = (1 << clk_div) *\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 (msg_timing * 4 + 1);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 delta_tmp = abs(clk_divisor -\n" "> clk_divisor_tmp);\n" - "> ??????????????????????????????? if (delta_tmp < delta_value) {\n" - "> ??????????????????????????????????????? delta_value = delta_tmp;\n" - "> ??????????????????????????????????????? priv->msg_timing = msg_timing;\n" - "> ??????????????????????????????????????? priv->addr_timing = priv->msg_timing;\n" - "> ??????????????????????????????????????? priv->clk_div = clk_div;\n" - "> ??????????????????????????????? }\n" - "> ??????????????????????? }\n" - "> ??????? }\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 if (delta_tmp < delta_value) {\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 delta_value = delta_tmp;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 priv->msg_timing = msg_timing;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 priv->addr_timing = priv->msg_timing;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 priv->clk_div = clk_div;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 }\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 }\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 }\n" "> \n" - "> ??? >?? +\n" - "> ??? >?? +static struct peci_controller_ops aspeed_ops = {\n" - "> ??? >?? +???????.xfer = aspeed_peci_xfer,\n" - "> ??? >?? +};\n" - "> ??? >?? +\n" - "> ??? >?? +static void aspeed_peci_reset_control_release(void *data)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????reset_control_assert(data);\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static int devm_aspeed_peci_reset_control_deassert(struct device\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static struct peci_controller_ops aspeed_ops = {\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.xfer = aspeed_peci_xfer,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +};\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static void aspeed_peci_reset_control_release(void *data)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240reset_control_assert(data);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static int devm_aspeed_peci_reset_control_deassert(struct device\n" "> *dev, struct reset_control *rst)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????int ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????ret = reset_control_deassert(rst);\n" - "> ??? >?? +???????if (ret)\n" - "> ??? >?? +???????????????return ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????return devm_add_action_or_reset(dev,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = reset_control_deassert(rst);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return devm_add_action_or_reset(dev,\n" "> aspeed_peci_reset_control_release, rst);\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static void aspeed_peci_clk_release(void *data)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????clk_disable_unprepare(data);\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static int devm_aspeed_peci_clk_enable(struct device *dev, struct clk\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static void aspeed_peci_clk_release(void *data)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_disable_unprepare(data);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static int devm_aspeed_peci_clk_enable(struct device *dev, struct clk\n" "> *clk)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????int ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????ret = clk_prepare_enable(clk);\n" - "> ??? >?? +???????if (ret)\n" - "> ??? >?? +???????????????return ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????return devm_add_action_or_reset(dev, aspeed_peci_clk_release,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = clk_prepare_enable(clk);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return devm_add_action_or_reset(dev, aspeed_peci_clk_release,\n" "> clk);\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static int aspeed_peci_probe(struct platform_device *pdev)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????struct peci_controller *controller;\n" - "> ??? >?? +???????struct aspeed_peci *priv;\n" - "> ??? >?? +???????int ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);\n" - "> ??? >?? +???????if (!priv)\n" - "> ??? >?? +???????????????return -ENOMEM;\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->dev = &pdev->dev;\n" - "> ??? >?? +???????dev_set_drvdata(priv->dev, priv);\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->base = devm_platform_ioremap_resource(pdev, 0);\n" - "> ??? >?? +???????if (IS_ERR(priv->base))\n" - "> ??? >?? +???????????????return PTR_ERR(priv->base);\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->irq = platform_get_irq(pdev, 0);\n" - "> ??? >?? +???????if (!priv->irq)\n" - "> ??? >?? +???????????????return priv->irq;\n" - "> ??? >?? +\n" - "> ??? >?? +???????ret = devm_request_irq(&pdev->dev, priv->irq,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static int aspeed_peci_probe(struct platform_device *pdev)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_controller *controller;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct aspeed_peci *priv;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!priv)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -ENOMEM;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->dev = &pdev->dev;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240dev_set_drvdata(priv->dev, priv);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->base = devm_platform_ioremap_resource(pdev, 0);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(priv->base))\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return PTR_ERR(priv->base);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->irq = platform_get_irq(pdev, 0);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!priv->irq)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return priv->irq;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = devm_request_irq(&pdev->dev, priv->irq,\n" "> aspeed_peci_irq_handler,\n" - "> ??? >?? +????????????????????????????? 0, \"peci-aspeed\", priv);\n" - "> ??? >?? +???????if (ret)\n" - "> ??? >?? +???????????????return ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????init_completion(&priv->xfer_complete);\n" - "> ??? >?? +???????spin_lock_init(&priv->lock);\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->rst = devm_reset_control_get(&pdev->dev, NULL);\n" - "> ??? >?? +???????if (IS_ERR(priv->rst))\n" - "> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(priv->rst),\n" - "> ??? >?? +??????????????????????????????????? \"failed to get reset control\\n\");\n" - "> ??? >?? +\n" - "> ??? >?? +???????ret = devm_aspeed_peci_reset_control_deassert(priv->dev, priv-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 0, \"peci-aspeed\", priv);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240init_completion(&priv->xfer_complete);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240spin_lock_init(&priv->lock);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->rst = devm_reset_control_get(&pdev->dev, NULL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(priv->rst))\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return dev_err_probe(priv->dev, PTR_ERR(priv->rst),\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 \"failed to get reset control\\n\");\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = devm_aspeed_peci_reset_control_deassert(priv->dev, priv-\n" "> >rst);\n" - "> ??? >?? +???????if (ret)\n" - "> ??? >?? +???????????????return dev_err_probe(priv->dev, ret, \"cannot deassert\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return dev_err_probe(priv->dev, ret, \"cannot deassert\n" "> reset control\\n\");\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->clk = devm_clk_get(priv->dev, NULL);\n" - "> ??? >?? +???????if (IS_ERR(priv->clk))\n" - "> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(priv->clk),\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->clk = devm_clk_get(priv->dev, NULL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(priv->clk))\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return dev_err_probe(priv->dev, PTR_ERR(priv->clk),\n" "> \"failed to get clk\\n\");\n" - "> ??? >?? +\n" - "> ??? >?? +???????ret = devm_aspeed_peci_clk_enable(priv->dev, priv->clk);\n" - "> ??? >?? +???????if (ret)\n" - "> ??? >?? +???????????????return dev_err_probe(priv->dev, ret, \"failed to enable\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = devm_aspeed_peci_clk_enable(priv->dev, priv->clk);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return dev_err_probe(priv->dev, ret, \"failed to enable\n" "> clock\\n\");\n" - "> ??? >?? +\n" - "> ??? >?? +???????aspeed_peci_property_setup(priv);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_setup(priv);\n" "> \n" - "> ??????? aspeed_peci_bus_freq_setup(priv);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 aspeed_peci_bus_freq_setup(priv);\n" "> \n" - "> ??? >?? +\n" - "> ??? >?? +???????aspeed_peci_init_regs(priv);\n" - "> ??? >?? +\n" - "> ??? >?? +???????controller = devm_peci_controller_add(priv->dev, &aspeed_ops);\n" - "> ??? >?? +???????if (IS_ERR(controller))\n" - "> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(controller),\n" - "> ??? >?? +??????????????????????????????????? \"failed to add aspeed peci\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_init_regs(priv);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240controller = devm_peci_controller_add(priv->dev, &aspeed_ops);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(controller))\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return dev_err_probe(priv->dev, PTR_ERR(controller),\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 \"failed to add aspeed peci\n" "> controller\\n\");\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->controller = controller;\n" - "> ??? >?? +\n" - "> ??? >?? +???????return 0;\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static const struct of_device_id aspeed_peci_of_table[] = {\n" - "> ??? >?? +???????{ .compatible = \"aspeed,ast2400-peci\", },\n" - "> ??? >?? +???????{ .compatible = \"aspeed,ast2500-peci\", },\n" - "> ??? >?? +???????{ .compatible = \"aspeed,ast2600-peci\", },\n" - "> ??? >?? +???????{ }\n" - "> ??? >?? +};\n" - "> ??? >?? +MODULE_DEVICE_TABLE(of, aspeed_peci_of_table);\n" - "> ??? >?? +\n" - "> ??? >?? +static struct platform_driver aspeed_peci_driver = {\n" - "> ??? >?? +???????.probe? = aspeed_peci_probe,\n" - "> ??? >?? +???????.driver = {\n" - "> ??? >?? +???????????????.name?????????? = \"peci-aspeed\",\n" - "> ??? >?? +???????????????.of_match_table = aspeed_peci_of_table,\n" - "> ??? >?? +???????},\n" - "> ??? >?? +};\n" - "> ??? >?? +module_platform_driver(aspeed_peci_driver);\n" - "> ??? >?? +\n" - "> ??? >?? +MODULE_AUTHOR(\"Ryan Chen <ryan_chen@aspeedtech.com>\");\n" - "> ??? >?? +MODULE_AUTHOR(\"Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>\");\n" - "> ??? >?? +MODULE_DESCRIPTION(\"ASPEED PECI driver\");\n" - "> ??? >?? +MODULE_LICENSE(\"GPL\");\n" - "> ??? >?? +MODULE_IMPORT_NS(PECI);\n" - "> ??? >?? -- \n" - "> ??? >?? 2.31.1\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->controller = controller;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static const struct of_device_id aspeed_peci_of_table[] = {\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240{ .compatible = \"aspeed,ast2400-peci\", },\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240{ .compatible = \"aspeed,ast2500-peci\", },\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240{ .compatible = \"aspeed,ast2600-peci\", },\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240{ }\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +};\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_DEVICE_TABLE(of, aspeed_peci_of_table);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static struct platform_driver aspeed_peci_driver = {\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.probe\302\240 = aspeed_peci_probe,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.driver = {\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240.name\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 = \"peci-aspeed\",\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240.of_match_table = aspeed_peci_of_table,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240},\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +};\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +module_platform_driver(aspeed_peci_driver);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_AUTHOR(\"Ryan Chen <ryan_chen@aspeedtech.com>\");\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_AUTHOR(\"Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>\");\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_DESCRIPTION(\"ASPEED PECI driver\");\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_LICENSE(\"GPL\");\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_IMPORT_NS(PECI);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 -- \n" + "> \302\240\302\240\302\240 >\302\240\302\240 2.31.1\n" "> \n" "> \n" > -d65c4b1428335a9cbd34f7be1f98049e617e1d21269286d21aa723f17ca92215 +0a7d50538520dc92fd3d3ea3a3cc035bf0a0df360020e4020f34e459a36696ed
diff --git a/a/1.txt b/N2/1.txt index e66cdfe..fd8617e 100644 --- a/a/1.txt +++ b/N2/1.txt @@ -5,82 +5,82 @@ On Mon, 2021-12-06 at 05:27 +0000, Billy Tsai wrote: > reply inline. > > On 2021/11/23, 10:11 PM, "openbmc on behalf of Iwona Winiarska" -> <openbmc-bounces+billy_tsai=aspeedtech.com@lists.ozlabs.org?on behalf of -> iwona.winiarska at intel.com> wrote: +> <openbmc-bounces+billy_tsai=aspeedtech.com@lists.ozlabs.org on behalf of +> iwona.winiarska@intel.com> wrote: > -> ??? >?? From: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com> +> > From: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com> > Add the define for the bus frequency -> ??????? #define ASPEED_PECI_BUS_FREQUENCY_MIN???????????2000 -> ??????? #define ASPEED_PECI_BUS_FREQUENCY_DEFAULT???????2000 -> ??????? #define ASPEED_PECI_BUS_FREQUENCY_MAX???????????1000000 +> #define ASPEED_PECI_BUS_FREQUENCY_MIN 2000 +> #define ASPEED_PECI_BUS_FREQUENCY_DEFAULT 2000 +> #define ASPEED_PECI_BUS_FREQUENCY_MAX 1000000 > -> ?? >?? +struct aspeed_peci { -> ??? >?? +???????struct peci_controller *controller; -> ??? >?? +???????struct device *dev; -> ??? >?? +???????void __iomem *base; -> ??? >?? +???????struct clk *clk; -> ??? >?? +???????struct reset_control *rst; -> ??? >?? +???????int irq; -> ??? >?? +???????spinlock_t lock; /* to sync completion status handling */ -> ??? >?? +???????struct completion xfer_complete; -> ??? >?? +???????u32 status; -> ??? >?? +???????u32 cmd_timeout_ms; -> ??? >?? +???????u32 msg_timing; -> ??? >?? +???????u32 addr_timing; -> ??? >?? +???????u32 rd_sampling_point; -> ??? >?? +???????u32 clk_div; +> > +struct aspeed_peci { +> > + struct peci_controller *controller; +> > + struct device *dev; +> > + void __iomem *base; +> > + struct clk *clk; +> > + struct reset_control *rst; +> > + int irq; +> > + spinlock_t lock; /* to sync completion status handling */ +> > + struct completion xfer_complete; +> > + u32 status; +> > + u32 cmd_timeout_ms; +> > + u32 msg_timing; +> > + u32 addr_timing; +> > + u32 rd_sampling_point; +> > + u32 clk_div; > > Add the paremeter to store the bus_freq from the dts property -> ??????? u32 bus_freq; +> u32 bus_freq; > -> ??? >?? +}; -> ??? >?? + -> ??? >?? +static void aspeed_peci_init_regs(struct aspeed_peci *priv) -> ??? >?? +{ -> ??? >?? +???????u32 val; -> ??? >?? + -> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, +> > +}; +> > + +> > +static void aspeed_peci_init_regs(struct aspeed_peci *priv) +> > +{ +> > + u32 val; +> > + +> > + val = FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, > ASPEED_PECI_CLK_DIV_DEFAULT); -> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_CLK_EN; -> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_CTRL); -> ??? >?? +???????/* -> ??? >?? +??????? * Timing negotiation period setting. -> ??? >?? +??????? * The unit of the programmed value is 4 times of PECI clock +> > + val |= ASPEED_PECI_CTRL_PECI_CLK_EN; +> > + writel(val, priv->base + ASPEED_PECI_CTRL); +> > + /* +> > + * Timing negotiation period setting. +> > + * The unit of the programmed value is 4 times of PECI clock > period. -> ??? >?? +??????? */ -> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_T_NEGO_MSG_MASK, priv- +> > + */ +> > + val = FIELD_PREP(ASPEED_PECI_T_NEGO_MSG_MASK, priv- > >msg_timing); -> ??? >?? +???????val |= FIELD_PREP(ASPEED_PECI_T_NEGO_ADDR_MASK, priv- +> > + val |= FIELD_PREP(ASPEED_PECI_T_NEGO_ADDR_MASK, priv- > >addr_timing); -> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_TIMING_NEGOTIATION); -> ??? >?? + -> ??? >?? +???????/* Clear interrupts */ -> ??? >?? +???????val = readl(priv->base + ASPEED_PECI_INT_STS) | +> > + writel(val, priv->base + ASPEED_PECI_TIMING_NEGOTIATION); +> > + +> > + /* Clear interrupts */ +> > + val = readl(priv->base + ASPEED_PECI_INT_STS) | > ASPEED_PECI_INT_MASK; -> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_INT_STS); -> ??? >?? + -> ??? >?? +???????/* Set timing negotiation mode and enable interrupts */ -> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_TIMING_NEGO_SEL_MASK, +> > + writel(val, priv->base + ASPEED_PECI_INT_STS); +> > + +> > + /* Set timing negotiation mode and enable interrupts */ +> > + val = FIELD_PREP(ASPEED_PECI_TIMING_NEGO_SEL_MASK, > ASPEED_PECI_1ST_BIT_OF_ADDR_NEGO); -> ??? >?? +???????val |= ASPEED_PECI_INT_MASK; -> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_INT_CTRL); -> ??? >?? + -> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_CTRL_SAMPLING_MASK, priv- +> > + val |= ASPEED_PECI_INT_MASK; +> > + writel(val, priv->base + ASPEED_PECI_INT_CTRL); +> > + +> > + val = FIELD_PREP(ASPEED_PECI_CTRL_SAMPLING_MASK, priv- > >rd_sampling_point); -> ??? >?? +???????val |= FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, priv- +> > + val |= FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, priv- > >clk_div); -> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_EN; -> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_CLK_EN; -> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_CTRL); -> ??? >?? +} -> ??? >?? + -> ??? >?? +static inline int aspeed_peci_check_idle(struct aspeed_peci *priv) -> ??? >?? +{ -> ??? >?? +???????u32 cmd_sts = readl(priv->base + ASPEED_PECI_CMD); -> ??? >?? + -> ??? >?? +???????if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts) == +> > + val |= ASPEED_PECI_CTRL_PECI_EN; +> > + val |= ASPEED_PECI_CTRL_PECI_CLK_EN; +> > + writel(val, priv->base + ASPEED_PECI_CTRL); +> > +} +> > + +> > +static inline int aspeed_peci_check_idle(struct aspeed_peci *priv) +> > +{ +> > + u32 cmd_sts = readl(priv->base + ASPEED_PECI_CMD); +> > + +> > + if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts) == > ASPEED_PECI_CMD_STS_ADDR_T_NEGO) -> ??? >?? +???????????????aspeed_peci_init_regs(priv); +> > + aspeed_peci_init_regs(priv); > > As long as the state is not idle, the controller need to reinitialize the PECI > register for solving the PECI controller hang. @@ -88,11 +88,11 @@ On Mon, 2021-12-06 at 05:27 +0000, Billy Tsai wrote: > the hang issue. > For backward compatible, I suggest to add the reset assert/de-assert in this > place. -> ??????? if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts)) { -> ??????????????????????? reset_control_assert(priv->rst); -> ??????????????????????? reset_control_deassert(priv->rst); -> ??????????????????????? aspeed_peci_init_regs(priv); -> ??????? } +> if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts)) { +> reset_control_assert(priv->rst); +> reset_control_deassert(priv->rst); +> aspeed_peci_init_regs(priv); +> } Ack. @@ -100,42 +100,42 @@ Ack. (...) -> ??? >?? +static void aspeed_peci_property_setup(struct aspeed_peci *priv) -> ??? >?? +{ -> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, "aspeed,clock- +> > +static void aspeed_peci_property_setup(struct aspeed_peci *priv) +> > +{ +> > + aspeed_peci_property_sanitize(priv->dev, "aspeed,clock- > divider", -> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_CLK_DIV_MAX, -> ??? >?? +???????????????????????????????????? ASPEED_PECI_CLK_DIV_DEFAULT, +> > + 0, ASPEED_PECI_CLK_DIV_MAX, +> > + ASPEED_PECI_CLK_DIV_DEFAULT, > &priv->clk_div); -> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, "aspeed,msg-timing", -> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_MSG_TIMING_MAX, -> ??? >?? +???????????????????????????????????? ASPEED_PECI_MSG_TIMING_DEFAULT, +> > + aspeed_peci_property_sanitize(priv->dev, "aspeed,msg-timing", +> > + 0, ASPEED_PECI_MSG_TIMING_MAX, +> > + ASPEED_PECI_MSG_TIMING_DEFAULT, > &priv->msg_timing); -> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, "aspeed,addr-timing", -> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_ADDR_TIMING_MAX, -> ??? >?? +???????????????????????????????????? ASPEED_PECI_ADDR_TIMING_DEFAULT, +> > + aspeed_peci_property_sanitize(priv->dev, "aspeed,addr-timing", +> > + 0, ASPEED_PECI_ADDR_TIMING_MAX, +> > + ASPEED_PECI_ADDR_TIMING_DEFAULT, > &priv->addr_timing); > > Use the bus-frequency to replace the property above: -> ??????? aspeed_peci_property_sanitize(priv->dev, "bus-frequency", -> ????????????????????????????????ASPEED_PECI_BUS_FREQUENCY_MIN, +> aspeed_peci_property_sanitize(priv->dev, "bus-frequency", +> ASPEED_PECI_BUS_FREQUENCY_MIN, > ASPEED_PECI_BUS_FREQUENCY_MAX, -> ????????????????????????????????ASPEED_PECI_BUS_FREQUENCY_DEFAULT, &priv- +> ASPEED_PECI_BUS_FREQUENCY_DEFAULT, &priv- > >bus_freq); > -> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, "aspeed,rd-sampling- +> > + aspeed_peci_property_sanitize(priv->dev, "aspeed,rd-sampling- > point", -> ??? >?? +???????????????????????????????????? 0, +> > + 0, > ASPEED_PECI_RD_SAMPLING_POINT_MAX, -> ??? >?? +???????????????????????????????????? +> > + > ASPEED_PECI_RD_SAMPLING_POINT_DEFAULT, -> ??? >?? +???????????????????????????????????? &priv->rd_sampling_point); -> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, "cmd-timeout-ms", -> ??? >?? +???????????????????????????????????? 1, +> > + &priv->rd_sampling_point); +> > + aspeed_peci_property_sanitize(priv->dev, "cmd-timeout-ms", +> > + 1, > ASPEED_PECI_CMD_TIMEOUT_MS_MAX, -> ??? >?? +???????????????????????????????????? +> > + > ASPEED_PECI_CMD_TIMEOUT_MS_DEFAULT, &priv->cmd_timeout_ms); -> ??? >?? +} +> > +} > Add the function of automatically calculating the settings to adapt to the bus > frequency. @@ -149,173 +149,173 @@ presenting this as what it actually is (a "custom" clock divider). Thanks -Iwona -> ??????? static void aspeed_peci_bus_freq_setup(struct aspeed_peci *priv) -> ??????? { -> ??????????????? unsigned long src_clk_rate; -> ??????????????? int delta_value, delta_tmp, clk_divisor, clk_divisor_tmp; -> ??????????????? u32 msg_timing, clk_div; +> static void aspeed_peci_bus_freq_setup(struct aspeed_peci *priv) +> { +> unsigned long src_clk_rate; +> int delta_value, delta_tmp, clk_divisor, clk_divisor_tmp; +> u32 msg_timing, clk_div; > -> ??????????????? src_clk_rate = clk_get_rate(priv->clk); +> src_clk_rate = clk_get_rate(priv->clk); > -> ??????????????? /* -> ???????????????? * PECI bus freq? = (source clk rate) / (4 * +> /* +> * PECI bus freq = (source clk rate) / (4 * > (PECI04[15:8]*4+1) * (1 << PECI00[10:8])) -> ???????????????? * (1 << PECI00[10:8]) * (PECI04[15:8]*4+1) = (source clk +> * (1 << PECI00[10:8]) * (PECI04[15:8]*4+1) = (source clk > rate) / (4 * PECI bus freq ) -> ???????????????? */ -> ??????????????? clk_divisor = src_clk_rate / (4 * priv->bus_freq); -> ??????????????? delta_value = clk_divisor; -> ??????????????? /* Find the closest divisor for bus-frequency */ -> ??????????????? for (msg_timing = 1; msg_timing <= 255; msg_timing++) -> ??????????????????????? for (clk_div = 0; clk_div < 7; -> ??????????????????????????????? clk_div++) { -> ??????????????????????????????? clk_divisor_tmp = (1 << clk_div) * -> ??????????????????????????????????????????????? (msg_timing * 4 + 1); -> ??????????????????????????????? delta_tmp = abs(clk_divisor - +> */ +> clk_divisor = src_clk_rate / (4 * priv->bus_freq); +> delta_value = clk_divisor; +> /* Find the closest divisor for bus-frequency */ +> for (msg_timing = 1; msg_timing <= 255; msg_timing++) +> for (clk_div = 0; clk_div < 7; +> clk_div++) { +> clk_divisor_tmp = (1 << clk_div) * +> (msg_timing * 4 + 1); +> delta_tmp = abs(clk_divisor - > clk_divisor_tmp); -> ??????????????????????????????? if (delta_tmp < delta_value) { -> ??????????????????????????????????????? delta_value = delta_tmp; -> ??????????????????????????????????????? priv->msg_timing = msg_timing; -> ??????????????????????????????????????? priv->addr_timing = priv->msg_timing; -> ??????????????????????????????????????? priv->clk_div = clk_div; -> ??????????????????????????????? } -> ??????????????????????? } -> ??????? } +> if (delta_tmp < delta_value) { +> delta_value = delta_tmp; +> priv->msg_timing = msg_timing; +> priv->addr_timing = priv->msg_timing; +> priv->clk_div = clk_div; +> } +> } +> } > -> ??? >?? + -> ??? >?? +static struct peci_controller_ops aspeed_ops = { -> ??? >?? +???????.xfer = aspeed_peci_xfer, -> ??? >?? +}; -> ??? >?? + -> ??? >?? +static void aspeed_peci_reset_control_release(void *data) -> ??? >?? +{ -> ??? >?? +???????reset_control_assert(data); -> ??? >?? +} -> ??? >?? + -> ??? >?? +static int devm_aspeed_peci_reset_control_deassert(struct device +> > + +> > +static struct peci_controller_ops aspeed_ops = { +> > + .xfer = aspeed_peci_xfer, +> > +}; +> > + +> > +static void aspeed_peci_reset_control_release(void *data) +> > +{ +> > + reset_control_assert(data); +> > +} +> > + +> > +static int devm_aspeed_peci_reset_control_deassert(struct device > *dev, struct reset_control *rst) -> ??? >?? +{ -> ??? >?? +???????int ret; -> ??? >?? + -> ??? >?? +???????ret = reset_control_deassert(rst); -> ??? >?? +???????if (ret) -> ??? >?? +???????????????return ret; -> ??? >?? + -> ??? >?? +???????return devm_add_action_or_reset(dev, +> > +{ +> > + int ret; +> > + +> > + ret = reset_control_deassert(rst); +> > + if (ret) +> > + return ret; +> > + +> > + return devm_add_action_or_reset(dev, > aspeed_peci_reset_control_release, rst); -> ??? >?? +} -> ??? >?? + -> ??? >?? +static void aspeed_peci_clk_release(void *data) -> ??? >?? +{ -> ??? >?? +???????clk_disable_unprepare(data); -> ??? >?? +} -> ??? >?? + -> ??? >?? +static int devm_aspeed_peci_clk_enable(struct device *dev, struct clk +> > +} +> > + +> > +static void aspeed_peci_clk_release(void *data) +> > +{ +> > + clk_disable_unprepare(data); +> > +} +> > + +> > +static int devm_aspeed_peci_clk_enable(struct device *dev, struct clk > *clk) -> ??? >?? +{ -> ??? >?? +???????int ret; -> ??? >?? + -> ??? >?? +???????ret = clk_prepare_enable(clk); -> ??? >?? +???????if (ret) -> ??? >?? +???????????????return ret; -> ??? >?? + -> ??? >?? +???????return devm_add_action_or_reset(dev, aspeed_peci_clk_release, +> > +{ +> > + int ret; +> > + +> > + ret = clk_prepare_enable(clk); +> > + if (ret) +> > + return ret; +> > + +> > + return devm_add_action_or_reset(dev, aspeed_peci_clk_release, > clk); -> ??? >?? +} -> ??? >?? + -> ??? >?? +static int aspeed_peci_probe(struct platform_device *pdev) -> ??? >?? +{ -> ??? >?? +???????struct peci_controller *controller; -> ??? >?? +???????struct aspeed_peci *priv; -> ??? >?? +???????int ret; -> ??? >?? + -> ??? >?? +???????priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); -> ??? >?? +???????if (!priv) -> ??? >?? +???????????????return -ENOMEM; -> ??? >?? + -> ??? >?? +???????priv->dev = &pdev->dev; -> ??? >?? +???????dev_set_drvdata(priv->dev, priv); -> ??? >?? + -> ??? >?? +???????priv->base = devm_platform_ioremap_resource(pdev, 0); -> ??? >?? +???????if (IS_ERR(priv->base)) -> ??? >?? +???????????????return PTR_ERR(priv->base); -> ??? >?? + -> ??? >?? +???????priv->irq = platform_get_irq(pdev, 0); -> ??? >?? +???????if (!priv->irq) -> ??? >?? +???????????????return priv->irq; -> ??? >?? + -> ??? >?? +???????ret = devm_request_irq(&pdev->dev, priv->irq, +> > +} +> > + +> > +static int aspeed_peci_probe(struct platform_device *pdev) +> > +{ +> > + struct peci_controller *controller; +> > + struct aspeed_peci *priv; +> > + int ret; +> > + +> > + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); +> > + if (!priv) +> > + return -ENOMEM; +> > + +> > + priv->dev = &pdev->dev; +> > + dev_set_drvdata(priv->dev, priv); +> > + +> > + priv->base = devm_platform_ioremap_resource(pdev, 0); +> > + if (IS_ERR(priv->base)) +> > + return PTR_ERR(priv->base); +> > + +> > + priv->irq = platform_get_irq(pdev, 0); +> > + if (!priv->irq) +> > + return priv->irq; +> > + +> > + ret = devm_request_irq(&pdev->dev, priv->irq, > aspeed_peci_irq_handler, -> ??? >?? +????????????????????????????? 0, "peci-aspeed", priv); -> ??? >?? +???????if (ret) -> ??? >?? +???????????????return ret; -> ??? >?? + -> ??? >?? +???????init_completion(&priv->xfer_complete); -> ??? >?? +???????spin_lock_init(&priv->lock); -> ??? >?? + -> ??? >?? +???????priv->rst = devm_reset_control_get(&pdev->dev, NULL); -> ??? >?? +???????if (IS_ERR(priv->rst)) -> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(priv->rst), -> ??? >?? +??????????????????????????????????? "failed to get reset control\n"); -> ??? >?? + -> ??? >?? +???????ret = devm_aspeed_peci_reset_control_deassert(priv->dev, priv- +> > + 0, "peci-aspeed", priv); +> > + if (ret) +> > + return ret; +> > + +> > + init_completion(&priv->xfer_complete); +> > + spin_lock_init(&priv->lock); +> > + +> > + priv->rst = devm_reset_control_get(&pdev->dev, NULL); +> > + if (IS_ERR(priv->rst)) +> > + return dev_err_probe(priv->dev, PTR_ERR(priv->rst), +> > + "failed to get reset control\n"); +> > + +> > + ret = devm_aspeed_peci_reset_control_deassert(priv->dev, priv- > >rst); -> ??? >?? +???????if (ret) -> ??? >?? +???????????????return dev_err_probe(priv->dev, ret, "cannot deassert +> > + if (ret) +> > + return dev_err_probe(priv->dev, ret, "cannot deassert > reset control\n"); -> ??? >?? + -> ??? >?? +???????priv->clk = devm_clk_get(priv->dev, NULL); -> ??? >?? +???????if (IS_ERR(priv->clk)) -> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(priv->clk), +> > + +> > + priv->clk = devm_clk_get(priv->dev, NULL); +> > + if (IS_ERR(priv->clk)) +> > + return dev_err_probe(priv->dev, PTR_ERR(priv->clk), > "failed to get clk\n"); -> ??? >?? + -> ??? >?? +???????ret = devm_aspeed_peci_clk_enable(priv->dev, priv->clk); -> ??? >?? +???????if (ret) -> ??? >?? +???????????????return dev_err_probe(priv->dev, ret, "failed to enable +> > + +> > + ret = devm_aspeed_peci_clk_enable(priv->dev, priv->clk); +> > + if (ret) +> > + return dev_err_probe(priv->dev, ret, "failed to enable > clock\n"); -> ??? >?? + -> ??? >?? +???????aspeed_peci_property_setup(priv); +> > + +> > + aspeed_peci_property_setup(priv); > -> ??????? aspeed_peci_bus_freq_setup(priv); +> aspeed_peci_bus_freq_setup(priv); > -> ??? >?? + -> ??? >?? +???????aspeed_peci_init_regs(priv); -> ??? >?? + -> ??? >?? +???????controller = devm_peci_controller_add(priv->dev, &aspeed_ops); -> ??? >?? +???????if (IS_ERR(controller)) -> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(controller), -> ??? >?? +??????????????????????????????????? "failed to add aspeed peci +> > + +> > + aspeed_peci_init_regs(priv); +> > + +> > + controller = devm_peci_controller_add(priv->dev, &aspeed_ops); +> > + if (IS_ERR(controller)) +> > + return dev_err_probe(priv->dev, PTR_ERR(controller), +> > + "failed to add aspeed peci > controller\n"); -> ??? >?? + -> ??? >?? +???????priv->controller = controller; -> ??? >?? + -> ??? >?? +???????return 0; -> ??? >?? +} -> ??? >?? + -> ??? >?? +static const struct of_device_id aspeed_peci_of_table[] = { -> ??? >?? +???????{ .compatible = "aspeed,ast2400-peci", }, -> ??? >?? +???????{ .compatible = "aspeed,ast2500-peci", }, -> ??? >?? +???????{ .compatible = "aspeed,ast2600-peci", }, -> ??? >?? +???????{ } -> ??? >?? +}; -> ??? >?? +MODULE_DEVICE_TABLE(of, aspeed_peci_of_table); -> ??? >?? + -> ??? >?? +static struct platform_driver aspeed_peci_driver = { -> ??? >?? +???????.probe? = aspeed_peci_probe, -> ??? >?? +???????.driver = { -> ??? >?? +???????????????.name?????????? = "peci-aspeed", -> ??? >?? +???????????????.of_match_table = aspeed_peci_of_table, -> ??? >?? +???????}, -> ??? >?? +}; -> ??? >?? +module_platform_driver(aspeed_peci_driver); -> ??? >?? + -> ??? >?? +MODULE_AUTHOR("Ryan Chen <ryan_chen@aspeedtech.com>"); -> ??? >?? +MODULE_AUTHOR("Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>"); -> ??? >?? +MODULE_DESCRIPTION("ASPEED PECI driver"); -> ??? >?? +MODULE_LICENSE("GPL"); -> ??? >?? +MODULE_IMPORT_NS(PECI); -> ??? >?? -- -> ??? >?? 2.31.1 +> > + +> > + priv->controller = controller; +> > + +> > + return 0; +> > +} +> > + +> > +static const struct of_device_id aspeed_peci_of_table[] = { +> > + { .compatible = "aspeed,ast2400-peci", }, +> > + { .compatible = "aspeed,ast2500-peci", }, +> > + { .compatible = "aspeed,ast2600-peci", }, +> > + { } +> > +}; +> > +MODULE_DEVICE_TABLE(of, aspeed_peci_of_table); +> > + +> > +static struct platform_driver aspeed_peci_driver = { +> > + .probe = aspeed_peci_probe, +> > + .driver = { +> > + .name = "peci-aspeed", +> > + .of_match_table = aspeed_peci_of_table, +> > + }, +> > +}; +> > +module_platform_driver(aspeed_peci_driver); +> > + +> > +MODULE_AUTHOR("Ryan Chen <ryan_chen@aspeedtech.com>"); +> > +MODULE_AUTHOR("Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>"); +> > +MODULE_DESCRIPTION("ASPEED PECI driver"); +> > +MODULE_LICENSE("GPL"); +> > +MODULE_IMPORT_NS(PECI); +> > -- +> > 2.31.1 > > > diff --git a/a/content_digest b/N2/content_digest index c3e1dab..5345b82 100644 --- a/a/content_digest +++ b/N2/content_digest @@ -2,9 +2,36 @@ "ref\020211123140706.2945700-6-iwona.winiarska@intel.com\0" "ref\071D27F36-8BB7-4C30-99C5-CCA4F9A30945@aspeedtech.com\0" "From\0Winiarska, Iwona <iwona.winiarska@intel.com>\0" - "Subject\0[PATCH v4 05/13] peci: Add peci-aspeed controller driver\0" + "Subject\0Re: [PATCH v4 05/13] peci: Add peci-aspeed controller driver\0" "Date\0Tue, 7 Dec 2021 18:09:36 +0000\0" - "To\0linux-aspeed@lists.ozlabs.org\0" + "To\0billy_tsai@aspeedtech.com <billy_tsai@aspeedtech.com>" + gregkh@linuxfoundation.org <gregkh@linuxfoundation.org> + linux-kernel@vger.kernel.org <linux-kernel@vger.kernel.org> + " openbmc@lists.ozlabs.org <openbmc@lists.ozlabs.org>\0" + "Cc\0linux-hwmon@vger.kernel.org <linux-hwmon@vger.kernel.org>" + devicetree@vger.kernel.org <devicetree@vger.kernel.org> + jae.hyun.yoo@linux.intel.com <jae.hyun.yoo@linux.intel.com> + Luck + Tony <tony.luck@intel.com> + arnd@arndb.de <arnd@arndb.de> + linux-aspeed@lists.ozlabs.org <linux-aspeed@lists.ozlabs.org> + corbet@lwn.net <corbet@lwn.net> + andrew@aj.id.au <andrew@aj.id.au> + rdunlap@infradead.org <rdunlap@infradead.org> + linux-doc@vger.kernel.org <linux-doc@vger.kernel.org> + pierre-louis.bossart@linux.intel.com <pierre-louis.bossart@linux.intel.com> + robh+dt@kernel.org <robh+dt@kernel.org> + Hansen + Dave <dave.hansen@intel.com> + jdelvare@suse.com <jdelvare@suse.com> + bp@alien8.de <bp@alien8.de> + linux-arm-kernel@lists.infradead.org <linux-arm-kernel@lists.infradead.org> + olof@lixom.net <olof@lixom.net> + Williams + Dan J <dan.j.williams@intel.com> + andriy.shevchenko@linux.intel.com <andriy.shevchenko@linux.intel.com> + linux@roeck-us.net <linux@roeck-us.net> + " zweiss@equinix.com <zweiss@equinix.com>\0" "\00:1\0" "b\0" "On Mon, 2021-12-06 at 05:27 +0000, Billy Tsai wrote:\n" @@ -14,82 +41,82 @@ "> reply inline.\n" "> \n" "> On 2021/11/23, 10:11 PM, \"openbmc on behalf of Iwona Winiarska\"\n" - "> <openbmc-bounces+billy_tsai=aspeedtech.com@lists.ozlabs.org?on behalf of\n" - "> iwona.winiarska at intel.com> wrote:\n" + "> <openbmc-bounces+billy_tsai=aspeedtech.com@lists.ozlabs.org\302\240on behalf of\n" + "> iwona.winiarska@intel.com> wrote:\n" "> \n" - "> ??? >?? From: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>\n" + "> \302\240\302\240\302\240 >\302\240\302\240 From: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>\n" "> Add the define for the bus frequency\n" - "> ??????? #define ASPEED_PECI_BUS_FREQUENCY_MIN???????????2000\n" - "> ??????? #define ASPEED_PECI_BUS_FREQUENCY_DEFAULT???????2000\n" - "> ??????? #define ASPEED_PECI_BUS_FREQUENCY_MAX???????????1000000\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 #define ASPEED_PECI_BUS_FREQUENCY_MIN\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2402000\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 #define ASPEED_PECI_BUS_FREQUENCY_DEFAULT\302\240\302\240\302\240\302\240\302\240\302\240\302\2402000\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 #define ASPEED_PECI_BUS_FREQUENCY_MAX\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2401000000\n" "> \n" - "> ?? >?? +struct aspeed_peci {\n" - "> ??? >?? +???????struct peci_controller *controller;\n" - "> ??? >?? +???????struct device *dev;\n" - "> ??? >?? +???????void __iomem *base;\n" - "> ??? >?? +???????struct clk *clk;\n" - "> ??? >?? +???????struct reset_control *rst;\n" - "> ??? >?? +???????int irq;\n" - "> ??? >?? +???????spinlock_t lock; /* to sync completion status handling */\n" - "> ??? >?? +???????struct completion xfer_complete;\n" - "> ??? >?? +???????u32 status;\n" - "> ??? >?? +???????u32 cmd_timeout_ms;\n" - "> ??? >?? +???????u32 msg_timing;\n" - "> ??? >?? +???????u32 addr_timing;\n" - "> ??? >?? +???????u32 rd_sampling_point;\n" - "> ??? >?? +???????u32 clk_div;\n" + "> \302\240\302\240 >\302\240\302\240 +struct aspeed_peci {\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_controller *controller;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct device *dev;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240void __iomem *base;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct clk *clk;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct reset_control *rst;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int irq;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240spinlock_t lock; /* to sync completion status handling */\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct completion xfer_complete;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 status;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 cmd_timeout_ms;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 msg_timing;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 addr_timing;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 rd_sampling_point;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 clk_div;\n" "> \n" "> Add the paremeter to store the bus_freq from the dts property\n" - "> ??????? u32 bus_freq;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 u32 bus_freq;\n" "> \n" - "> ??? >?? +};\n" - "> ??? >?? +\n" - "> ??? >?? +static void aspeed_peci_init_regs(struct aspeed_peci *priv)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????u32 val;\n" - "> ??? >?? +\n" - "> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +};\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static void aspeed_peci_init_regs(struct aspeed_peci *priv)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 val;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val = FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK,\n" "> ASPEED_PECI_CLK_DIV_DEFAULT);\n" - "> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_CLK_EN;\n" - "> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_CTRL);\n" - "> ??? >?? +???????/*\n" - "> ??? >?? +??????? * Timing negotiation period setting.\n" - "> ??? >?? +??????? * The unit of the programmed value is 4 times of PECI clock\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= ASPEED_PECI_CTRL_PECI_CLK_EN;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240writel(val, priv->base + ASPEED_PECI_CTRL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240/*\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240 * Timing negotiation period setting.\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240 * The unit of the programmed value is 4 times of PECI clock\n" "> period.\n" - "> ??? >?? +??????? */\n" - "> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_T_NEGO_MSG_MASK, priv-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240 */\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val = FIELD_PREP(ASPEED_PECI_T_NEGO_MSG_MASK, priv-\n" "> >msg_timing);\n" - "> ??? >?? +???????val |= FIELD_PREP(ASPEED_PECI_T_NEGO_ADDR_MASK, priv-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= FIELD_PREP(ASPEED_PECI_T_NEGO_ADDR_MASK, priv-\n" "> >addr_timing);\n" - "> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_TIMING_NEGOTIATION);\n" - "> ??? >?? +\n" - "> ??? >?? +???????/* Clear interrupts */\n" - "> ??? >?? +???????val = readl(priv->base + ASPEED_PECI_INT_STS) |\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240writel(val, priv->base + ASPEED_PECI_TIMING_NEGOTIATION);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240/* Clear interrupts */\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val = readl(priv->base + ASPEED_PECI_INT_STS) |\n" "> ASPEED_PECI_INT_MASK;\n" - "> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_INT_STS);\n" - "> ??? >?? +\n" - "> ??? >?? +???????/* Set timing negotiation mode and enable interrupts */\n" - "> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_TIMING_NEGO_SEL_MASK,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240writel(val, priv->base + ASPEED_PECI_INT_STS);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240/* Set timing negotiation mode and enable interrupts */\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val = FIELD_PREP(ASPEED_PECI_TIMING_NEGO_SEL_MASK,\n" "> ASPEED_PECI_1ST_BIT_OF_ADDR_NEGO);\n" - "> ??? >?? +???????val |= ASPEED_PECI_INT_MASK;\n" - "> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_INT_CTRL);\n" - "> ??? >?? +\n" - "> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_CTRL_SAMPLING_MASK, priv-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= ASPEED_PECI_INT_MASK;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240writel(val, priv->base + ASPEED_PECI_INT_CTRL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val = FIELD_PREP(ASPEED_PECI_CTRL_SAMPLING_MASK, priv-\n" "> >rd_sampling_point);\n" - "> ??? >?? +???????val |= FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, priv-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, priv-\n" "> >clk_div);\n" - "> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_EN;\n" - "> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_CLK_EN;\n" - "> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_CTRL);\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static inline int aspeed_peci_check_idle(struct aspeed_peci *priv)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????u32 cmd_sts = readl(priv->base + ASPEED_PECI_CMD);\n" - "> ??? >?? +\n" - "> ??? >?? +???????if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts) ==\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= ASPEED_PECI_CTRL_PECI_EN;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= ASPEED_PECI_CTRL_PECI_CLK_EN;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240writel(val, priv->base + ASPEED_PECI_CTRL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static inline int aspeed_peci_check_idle(struct aspeed_peci *priv)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 cmd_sts = readl(priv->base + ASPEED_PECI_CMD);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts) ==\n" "> ASPEED_PECI_CMD_STS_ADDR_T_NEGO)\n" - "> ??? >?? +???????????????aspeed_peci_init_regs(priv);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_init_regs(priv);\n" "> \n" "> As long as the state is not idle, the controller need to reinitialize the PECI\n" "> register for solving the PECI controller hang.\n" @@ -97,11 +124,11 @@ "> the hang issue.\n" "> For backward compatible, I suggest to add the reset assert/de-assert in this\n" "> place.\n" - "> ??????? if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts)) {\n" - "> ??????????????????????? reset_control_assert(priv->rst);\n" - "> ??????????????????????? reset_control_deassert(priv->rst);\n" - "> ??????????????????????? aspeed_peci_init_regs(priv);\n" - "> ??????? }\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts)) {\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 reset_control_assert(priv->rst);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 reset_control_deassert(priv->rst);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 aspeed_peci_init_regs(priv);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 }\n" "\n" "Ack.\n" "\n" @@ -109,42 +136,42 @@ "\n" "(...)\n" "\n" - "> ??? >?? +static void aspeed_peci_property_setup(struct aspeed_peci *priv)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, \"aspeed,clock-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static void aspeed_peci_property_setup(struct aspeed_peci *priv)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_sanitize(priv->dev, \"aspeed,clock-\n" "> divider\",\n" - "> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_CLK_DIV_MAX,\n" - "> ??? >?? +???????????????????????????????????? ASPEED_PECI_CLK_DIV_DEFAULT,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 0, ASPEED_PECI_CLK_DIV_MAX,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 ASPEED_PECI_CLK_DIV_DEFAULT,\n" "> &priv->clk_div);\n" - "> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, \"aspeed,msg-timing\",\n" - "> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_MSG_TIMING_MAX,\n" - "> ??? >?? +???????????????????????????????????? ASPEED_PECI_MSG_TIMING_DEFAULT,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_sanitize(priv->dev, \"aspeed,msg-timing\",\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 0, ASPEED_PECI_MSG_TIMING_MAX,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 ASPEED_PECI_MSG_TIMING_DEFAULT,\n" "> &priv->msg_timing);\n" - "> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, \"aspeed,addr-timing\",\n" - "> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_ADDR_TIMING_MAX,\n" - "> ??? >?? +???????????????????????????????????? ASPEED_PECI_ADDR_TIMING_DEFAULT,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_sanitize(priv->dev, \"aspeed,addr-timing\",\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 0, ASPEED_PECI_ADDR_TIMING_MAX,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 ASPEED_PECI_ADDR_TIMING_DEFAULT,\n" "> &priv->addr_timing);\n" "> \n" "> Use the bus-frequency to replace the property above:\n" - "> ??????? aspeed_peci_property_sanitize(priv->dev, \"bus-frequency\",\n" - "> ????????????????????????????????ASPEED_PECI_BUS_FREQUENCY_MIN,\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 aspeed_peci_property_sanitize(priv->dev, \"bus-frequency\",\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ASPEED_PECI_BUS_FREQUENCY_MIN,\n" "> ASPEED_PECI_BUS_FREQUENCY_MAX,\n" - "> ????????????????????????????????ASPEED_PECI_BUS_FREQUENCY_DEFAULT, &priv-\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ASPEED_PECI_BUS_FREQUENCY_DEFAULT, &priv-\n" "> >bus_freq);\n" "> \n" - "> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, \"aspeed,rd-sampling-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_sanitize(priv->dev, \"aspeed,rd-sampling-\n" "> point\",\n" - "> ??? >?? +???????????????????????????????????? 0,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 0,\n" "> ASPEED_PECI_RD_SAMPLING_POINT_MAX,\n" - "> ??? >?? +????????????????????????????????????\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\n" "> ASPEED_PECI_RD_SAMPLING_POINT_DEFAULT,\n" - "> ??? >?? +???????????????????????????????????? &priv->rd_sampling_point);\n" - "> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, \"cmd-timeout-ms\",\n" - "> ??? >?? +???????????????????????????????????? 1,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 &priv->rd_sampling_point);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_sanitize(priv->dev, \"cmd-timeout-ms\",\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 1,\n" "> ASPEED_PECI_CMD_TIMEOUT_MS_MAX,\n" - "> ??? >?? +????????????????????????????????????\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\n" "> ASPEED_PECI_CMD_TIMEOUT_MS_DEFAULT, &priv->cmd_timeout_ms);\n" - "> ??? >?? +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" "> Add the function of automatically calculating the settings to adapt to the bus\n" "> frequency.\n" "\n" @@ -158,175 +185,175 @@ "Thanks\n" "-Iwona\n" "\n" - "> ??????? static void aspeed_peci_bus_freq_setup(struct aspeed_peci *priv)\n" - "> ??????? {\n" - "> ??????????????? unsigned long src_clk_rate;\n" - "> ??????????????? int delta_value, delta_tmp, clk_divisor, clk_divisor_tmp;\n" - "> ??????????????? u32 msg_timing, clk_div;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 static void aspeed_peci_bus_freq_setup(struct aspeed_peci *priv)\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 {\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 unsigned long src_clk_rate;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 int delta_value, delta_tmp, clk_divisor, clk_divisor_tmp;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 u32 msg_timing, clk_div;\n" "> \n" - "> ??????????????? src_clk_rate = clk_get_rate(priv->clk);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 src_clk_rate = clk_get_rate(priv->clk);\n" "> \n" - "> ??????????????? /*\n" - "> ???????????????? * PECI bus freq? = (source clk rate) / (4 *\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 /*\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 * PECI bus freq\302\240 = (source clk rate) / (4 *\n" "> (PECI04[15:8]*4+1) * (1 << PECI00[10:8]))\n" - "> ???????????????? * (1 << PECI00[10:8]) * (PECI04[15:8]*4+1) = (source clk\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 * (1 << PECI00[10:8]) * (PECI04[15:8]*4+1) = (source clk\n" "> rate) / (4 * PECI bus freq )\n" - "> ???????????????? */\n" - "> ??????????????? clk_divisor = src_clk_rate / (4 * priv->bus_freq);\n" - "> ??????????????? delta_value = clk_divisor;\n" - "> ??????????????? /* Find the closest divisor for bus-frequency */\n" - "> ??????????????? for (msg_timing = 1; msg_timing <= 255; msg_timing++)\n" - "> ??????????????????????? for (clk_div = 0; clk_div < 7;\n" - "> ??????????????????????????????? clk_div++) {\n" - "> ??????????????????????????????? clk_divisor_tmp = (1 << clk_div) *\n" - "> ??????????????????????????????????????????????? (msg_timing * 4 + 1);\n" - "> ??????????????????????????????? delta_tmp = abs(clk_divisor -\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 */\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 clk_divisor = src_clk_rate / (4 * priv->bus_freq);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 delta_value = clk_divisor;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 /* Find the closest divisor for bus-frequency */\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 for (msg_timing = 1; msg_timing <= 255; msg_timing++)\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 for (clk_div = 0; clk_div < 7;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 clk_div++) {\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 clk_divisor_tmp = (1 << clk_div) *\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 (msg_timing * 4 + 1);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 delta_tmp = abs(clk_divisor -\n" "> clk_divisor_tmp);\n" - "> ??????????????????????????????? if (delta_tmp < delta_value) {\n" - "> ??????????????????????????????????????? delta_value = delta_tmp;\n" - "> ??????????????????????????????????????? priv->msg_timing = msg_timing;\n" - "> ??????????????????????????????????????? priv->addr_timing = priv->msg_timing;\n" - "> ??????????????????????????????????????? priv->clk_div = clk_div;\n" - "> ??????????????????????????????? }\n" - "> ??????????????????????? }\n" - "> ??????? }\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 if (delta_tmp < delta_value) {\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 delta_value = delta_tmp;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 priv->msg_timing = msg_timing;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 priv->addr_timing = priv->msg_timing;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 priv->clk_div = clk_div;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 }\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 }\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 }\n" "> \n" - "> ??? >?? +\n" - "> ??? >?? +static struct peci_controller_ops aspeed_ops = {\n" - "> ??? >?? +???????.xfer = aspeed_peci_xfer,\n" - "> ??? >?? +};\n" - "> ??? >?? +\n" - "> ??? >?? +static void aspeed_peci_reset_control_release(void *data)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????reset_control_assert(data);\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static int devm_aspeed_peci_reset_control_deassert(struct device\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static struct peci_controller_ops aspeed_ops = {\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.xfer = aspeed_peci_xfer,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +};\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static void aspeed_peci_reset_control_release(void *data)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240reset_control_assert(data);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static int devm_aspeed_peci_reset_control_deassert(struct device\n" "> *dev, struct reset_control *rst)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????int ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????ret = reset_control_deassert(rst);\n" - "> ??? >?? +???????if (ret)\n" - "> ??? >?? +???????????????return ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????return devm_add_action_or_reset(dev,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = reset_control_deassert(rst);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return devm_add_action_or_reset(dev,\n" "> aspeed_peci_reset_control_release, rst);\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static void aspeed_peci_clk_release(void *data)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????clk_disable_unprepare(data);\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static int devm_aspeed_peci_clk_enable(struct device *dev, struct clk\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static void aspeed_peci_clk_release(void *data)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_disable_unprepare(data);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static int devm_aspeed_peci_clk_enable(struct device *dev, struct clk\n" "> *clk)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????int ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????ret = clk_prepare_enable(clk);\n" - "> ??? >?? +???????if (ret)\n" - "> ??? >?? +???????????????return ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????return devm_add_action_or_reset(dev, aspeed_peci_clk_release,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = clk_prepare_enable(clk);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return devm_add_action_or_reset(dev, aspeed_peci_clk_release,\n" "> clk);\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static int aspeed_peci_probe(struct platform_device *pdev)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????struct peci_controller *controller;\n" - "> ??? >?? +???????struct aspeed_peci *priv;\n" - "> ??? >?? +???????int ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);\n" - "> ??? >?? +???????if (!priv)\n" - "> ??? >?? +???????????????return -ENOMEM;\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->dev = &pdev->dev;\n" - "> ??? >?? +???????dev_set_drvdata(priv->dev, priv);\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->base = devm_platform_ioremap_resource(pdev, 0);\n" - "> ??? >?? +???????if (IS_ERR(priv->base))\n" - "> ??? >?? +???????????????return PTR_ERR(priv->base);\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->irq = platform_get_irq(pdev, 0);\n" - "> ??? >?? +???????if (!priv->irq)\n" - "> ??? >?? +???????????????return priv->irq;\n" - "> ??? >?? +\n" - "> ??? >?? +???????ret = devm_request_irq(&pdev->dev, priv->irq,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static int aspeed_peci_probe(struct platform_device *pdev)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_controller *controller;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct aspeed_peci *priv;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!priv)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -ENOMEM;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->dev = &pdev->dev;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240dev_set_drvdata(priv->dev, priv);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->base = devm_platform_ioremap_resource(pdev, 0);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(priv->base))\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return PTR_ERR(priv->base);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->irq = platform_get_irq(pdev, 0);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!priv->irq)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return priv->irq;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = devm_request_irq(&pdev->dev, priv->irq,\n" "> aspeed_peci_irq_handler,\n" - "> ??? >?? +????????????????????????????? 0, \"peci-aspeed\", priv);\n" - "> ??? >?? +???????if (ret)\n" - "> ??? >?? +???????????????return ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????init_completion(&priv->xfer_complete);\n" - "> ??? >?? +???????spin_lock_init(&priv->lock);\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->rst = devm_reset_control_get(&pdev->dev, NULL);\n" - "> ??? >?? +???????if (IS_ERR(priv->rst))\n" - "> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(priv->rst),\n" - "> ??? >?? +??????????????????????????????????? \"failed to get reset control\\n\");\n" - "> ??? >?? +\n" - "> ??? >?? +???????ret = devm_aspeed_peci_reset_control_deassert(priv->dev, priv-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 0, \"peci-aspeed\", priv);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240init_completion(&priv->xfer_complete);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240spin_lock_init(&priv->lock);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->rst = devm_reset_control_get(&pdev->dev, NULL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(priv->rst))\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return dev_err_probe(priv->dev, PTR_ERR(priv->rst),\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 \"failed to get reset control\\n\");\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = devm_aspeed_peci_reset_control_deassert(priv->dev, priv-\n" "> >rst);\n" - "> ??? >?? +???????if (ret)\n" - "> ??? >?? +???????????????return dev_err_probe(priv->dev, ret, \"cannot deassert\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return dev_err_probe(priv->dev, ret, \"cannot deassert\n" "> reset control\\n\");\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->clk = devm_clk_get(priv->dev, NULL);\n" - "> ??? >?? +???????if (IS_ERR(priv->clk))\n" - "> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(priv->clk),\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->clk = devm_clk_get(priv->dev, NULL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(priv->clk))\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return dev_err_probe(priv->dev, PTR_ERR(priv->clk),\n" "> \"failed to get clk\\n\");\n" - "> ??? >?? +\n" - "> ??? >?? +???????ret = devm_aspeed_peci_clk_enable(priv->dev, priv->clk);\n" - "> ??? >?? +???????if (ret)\n" - "> ??? >?? +???????????????return dev_err_probe(priv->dev, ret, \"failed to enable\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = devm_aspeed_peci_clk_enable(priv->dev, priv->clk);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return dev_err_probe(priv->dev, ret, \"failed to enable\n" "> clock\\n\");\n" - "> ??? >?? +\n" - "> ??? >?? +???????aspeed_peci_property_setup(priv);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_setup(priv);\n" "> \n" - "> ??????? aspeed_peci_bus_freq_setup(priv);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 aspeed_peci_bus_freq_setup(priv);\n" "> \n" - "> ??? >?? +\n" - "> ??? >?? +???????aspeed_peci_init_regs(priv);\n" - "> ??? >?? +\n" - "> ??? >?? +???????controller = devm_peci_controller_add(priv->dev, &aspeed_ops);\n" - "> ??? >?? +???????if (IS_ERR(controller))\n" - "> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(controller),\n" - "> ??? >?? +??????????????????????????????????? \"failed to add aspeed peci\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_init_regs(priv);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240controller = devm_peci_controller_add(priv->dev, &aspeed_ops);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(controller))\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return dev_err_probe(priv->dev, PTR_ERR(controller),\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 \"failed to add aspeed peci\n" "> controller\\n\");\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->controller = controller;\n" - "> ??? >?? +\n" - "> ??? >?? +???????return 0;\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static const struct of_device_id aspeed_peci_of_table[] = {\n" - "> ??? >?? +???????{ .compatible = \"aspeed,ast2400-peci\", },\n" - "> ??? >?? +???????{ .compatible = \"aspeed,ast2500-peci\", },\n" - "> ??? >?? +???????{ .compatible = \"aspeed,ast2600-peci\", },\n" - "> ??? >?? +???????{ }\n" - "> ??? >?? +};\n" - "> ??? >?? +MODULE_DEVICE_TABLE(of, aspeed_peci_of_table);\n" - "> ??? >?? +\n" - "> ??? >?? +static struct platform_driver aspeed_peci_driver = {\n" - "> ??? >?? +???????.probe? = aspeed_peci_probe,\n" - "> ??? >?? +???????.driver = {\n" - "> ??? >?? +???????????????.name?????????? = \"peci-aspeed\",\n" - "> ??? >?? +???????????????.of_match_table = aspeed_peci_of_table,\n" - "> ??? >?? +???????},\n" - "> ??? >?? +};\n" - "> ??? >?? +module_platform_driver(aspeed_peci_driver);\n" - "> ??? >?? +\n" - "> ??? >?? +MODULE_AUTHOR(\"Ryan Chen <ryan_chen@aspeedtech.com>\");\n" - "> ??? >?? +MODULE_AUTHOR(\"Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>\");\n" - "> ??? >?? +MODULE_DESCRIPTION(\"ASPEED PECI driver\");\n" - "> ??? >?? +MODULE_LICENSE(\"GPL\");\n" - "> ??? >?? +MODULE_IMPORT_NS(PECI);\n" - "> ??? >?? -- \n" - "> ??? >?? 2.31.1\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->controller = controller;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static const struct of_device_id aspeed_peci_of_table[] = {\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240{ .compatible = \"aspeed,ast2400-peci\", },\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240{ .compatible = \"aspeed,ast2500-peci\", },\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240{ .compatible = \"aspeed,ast2600-peci\", },\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240{ }\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +};\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_DEVICE_TABLE(of, aspeed_peci_of_table);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static struct platform_driver aspeed_peci_driver = {\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.probe\302\240 = aspeed_peci_probe,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.driver = {\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240.name\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 = \"peci-aspeed\",\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240.of_match_table = aspeed_peci_of_table,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240},\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +};\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +module_platform_driver(aspeed_peci_driver);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_AUTHOR(\"Ryan Chen <ryan_chen@aspeedtech.com>\");\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_AUTHOR(\"Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>\");\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_DESCRIPTION(\"ASPEED PECI driver\");\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_LICENSE(\"GPL\");\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_IMPORT_NS(PECI);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 -- \n" + "> \302\240\302\240\302\240 >\302\240\302\240 2.31.1\n" "> \n" "> \n" > -d65c4b1428335a9cbd34f7be1f98049e617e1d21269286d21aa723f17ca92215 +ae141a1b30cb1a62ea809d46fb6f9ce6500e8bc181236c4b4b999b5b19efbffa
diff --git a/a/1.txt b/N3/1.txt index e66cdfe..0cd9652 100644 --- a/a/1.txt +++ b/N3/1.txt @@ -5,82 +5,82 @@ On Mon, 2021-12-06 at 05:27 +0000, Billy Tsai wrote: > reply inline. > > On 2021/11/23, 10:11 PM, "openbmc on behalf of Iwona Winiarska" -> <openbmc-bounces+billy_tsai=aspeedtech.com@lists.ozlabs.org?on behalf of -> iwona.winiarska at intel.com> wrote: +> <openbmc-bounces+billy_tsai=aspeedtech.com@lists.ozlabs.org on behalf of +> iwona.winiarska@intel.com> wrote: > -> ??? >?? From: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com> +> > From: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com> > Add the define for the bus frequency -> ??????? #define ASPEED_PECI_BUS_FREQUENCY_MIN???????????2000 -> ??????? #define ASPEED_PECI_BUS_FREQUENCY_DEFAULT???????2000 -> ??????? #define ASPEED_PECI_BUS_FREQUENCY_MAX???????????1000000 +> #define ASPEED_PECI_BUS_FREQUENCY_MIN 2000 +> #define ASPEED_PECI_BUS_FREQUENCY_DEFAULT 2000 +> #define ASPEED_PECI_BUS_FREQUENCY_MAX 1000000 > -> ?? >?? +struct aspeed_peci { -> ??? >?? +???????struct peci_controller *controller; -> ??? >?? +???????struct device *dev; -> ??? >?? +???????void __iomem *base; -> ??? >?? +???????struct clk *clk; -> ??? >?? +???????struct reset_control *rst; -> ??? >?? +???????int irq; -> ??? >?? +???????spinlock_t lock; /* to sync completion status handling */ -> ??? >?? +???????struct completion xfer_complete; -> ??? >?? +???????u32 status; -> ??? >?? +???????u32 cmd_timeout_ms; -> ??? >?? +???????u32 msg_timing; -> ??? >?? +???????u32 addr_timing; -> ??? >?? +???????u32 rd_sampling_point; -> ??? >?? +???????u32 clk_div; +> > +struct aspeed_peci { +> > + struct peci_controller *controller; +> > + struct device *dev; +> > + void __iomem *base; +> > + struct clk *clk; +> > + struct reset_control *rst; +> > + int irq; +> > + spinlock_t lock; /* to sync completion status handling */ +> > + struct completion xfer_complete; +> > + u32 status; +> > + u32 cmd_timeout_ms; +> > + u32 msg_timing; +> > + u32 addr_timing; +> > + u32 rd_sampling_point; +> > + u32 clk_div; > > Add the paremeter to store the bus_freq from the dts property -> ??????? u32 bus_freq; +> u32 bus_freq; > -> ??? >?? +}; -> ??? >?? + -> ??? >?? +static void aspeed_peci_init_regs(struct aspeed_peci *priv) -> ??? >?? +{ -> ??? >?? +???????u32 val; -> ??? >?? + -> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, +> > +}; +> > + +> > +static void aspeed_peci_init_regs(struct aspeed_peci *priv) +> > +{ +> > + u32 val; +> > + +> > + val = FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, > ASPEED_PECI_CLK_DIV_DEFAULT); -> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_CLK_EN; -> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_CTRL); -> ??? >?? +???????/* -> ??? >?? +??????? * Timing negotiation period setting. -> ??? >?? +??????? * The unit of the programmed value is 4 times of PECI clock +> > + val |= ASPEED_PECI_CTRL_PECI_CLK_EN; +> > + writel(val, priv->base + ASPEED_PECI_CTRL); +> > + /* +> > + * Timing negotiation period setting. +> > + * The unit of the programmed value is 4 times of PECI clock > period. -> ??? >?? +??????? */ -> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_T_NEGO_MSG_MASK, priv- +> > + */ +> > + val = FIELD_PREP(ASPEED_PECI_T_NEGO_MSG_MASK, priv- > >msg_timing); -> ??? >?? +???????val |= FIELD_PREP(ASPEED_PECI_T_NEGO_ADDR_MASK, priv- +> > + val |= FIELD_PREP(ASPEED_PECI_T_NEGO_ADDR_MASK, priv- > >addr_timing); -> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_TIMING_NEGOTIATION); -> ??? >?? + -> ??? >?? +???????/* Clear interrupts */ -> ??? >?? +???????val = readl(priv->base + ASPEED_PECI_INT_STS) | +> > + writel(val, priv->base + ASPEED_PECI_TIMING_NEGOTIATION); +> > + +> > + /* Clear interrupts */ +> > + val = readl(priv->base + ASPEED_PECI_INT_STS) | > ASPEED_PECI_INT_MASK; -> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_INT_STS); -> ??? >?? + -> ??? >?? +???????/* Set timing negotiation mode and enable interrupts */ -> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_TIMING_NEGO_SEL_MASK, +> > + writel(val, priv->base + ASPEED_PECI_INT_STS); +> > + +> > + /* Set timing negotiation mode and enable interrupts */ +> > + val = FIELD_PREP(ASPEED_PECI_TIMING_NEGO_SEL_MASK, > ASPEED_PECI_1ST_BIT_OF_ADDR_NEGO); -> ??? >?? +???????val |= ASPEED_PECI_INT_MASK; -> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_INT_CTRL); -> ??? >?? + -> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_CTRL_SAMPLING_MASK, priv- +> > + val |= ASPEED_PECI_INT_MASK; +> > + writel(val, priv->base + ASPEED_PECI_INT_CTRL); +> > + +> > + val = FIELD_PREP(ASPEED_PECI_CTRL_SAMPLING_MASK, priv- > >rd_sampling_point); -> ??? >?? +???????val |= FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, priv- +> > + val |= FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, priv- > >clk_div); -> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_EN; -> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_CLK_EN; -> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_CTRL); -> ??? >?? +} -> ??? >?? + -> ??? >?? +static inline int aspeed_peci_check_idle(struct aspeed_peci *priv) -> ??? >?? +{ -> ??? >?? +???????u32 cmd_sts = readl(priv->base + ASPEED_PECI_CMD); -> ??? >?? + -> ??? >?? +???????if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts) == +> > + val |= ASPEED_PECI_CTRL_PECI_EN; +> > + val |= ASPEED_PECI_CTRL_PECI_CLK_EN; +> > + writel(val, priv->base + ASPEED_PECI_CTRL); +> > +} +> > + +> > +static inline int aspeed_peci_check_idle(struct aspeed_peci *priv) +> > +{ +> > + u32 cmd_sts = readl(priv->base + ASPEED_PECI_CMD); +> > + +> > + if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts) == > ASPEED_PECI_CMD_STS_ADDR_T_NEGO) -> ??? >?? +???????????????aspeed_peci_init_regs(priv); +> > + aspeed_peci_init_regs(priv); > > As long as the state is not idle, the controller need to reinitialize the PECI > register for solving the PECI controller hang. @@ -88,11 +88,11 @@ On Mon, 2021-12-06 at 05:27 +0000, Billy Tsai wrote: > the hang issue. > For backward compatible, I suggest to add the reset assert/de-assert in this > place. -> ??????? if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts)) { -> ??????????????????????? reset_control_assert(priv->rst); -> ??????????????????????? reset_control_deassert(priv->rst); -> ??????????????????????? aspeed_peci_init_regs(priv); -> ??????? } +> if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts)) { +> reset_control_assert(priv->rst); +> reset_control_deassert(priv->rst); +> aspeed_peci_init_regs(priv); +> } Ack. @@ -100,42 +100,42 @@ Ack. (...) -> ??? >?? +static void aspeed_peci_property_setup(struct aspeed_peci *priv) -> ??? >?? +{ -> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, "aspeed,clock- +> > +static void aspeed_peci_property_setup(struct aspeed_peci *priv) +> > +{ +> > + aspeed_peci_property_sanitize(priv->dev, "aspeed,clock- > divider", -> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_CLK_DIV_MAX, -> ??? >?? +???????????????????????????????????? ASPEED_PECI_CLK_DIV_DEFAULT, +> > + 0, ASPEED_PECI_CLK_DIV_MAX, +> > + ASPEED_PECI_CLK_DIV_DEFAULT, > &priv->clk_div); -> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, "aspeed,msg-timing", -> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_MSG_TIMING_MAX, -> ??? >?? +???????????????????????????????????? ASPEED_PECI_MSG_TIMING_DEFAULT, +> > + aspeed_peci_property_sanitize(priv->dev, "aspeed,msg-timing", +> > + 0, ASPEED_PECI_MSG_TIMING_MAX, +> > + ASPEED_PECI_MSG_TIMING_DEFAULT, > &priv->msg_timing); -> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, "aspeed,addr-timing", -> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_ADDR_TIMING_MAX, -> ??? >?? +???????????????????????????????????? ASPEED_PECI_ADDR_TIMING_DEFAULT, +> > + aspeed_peci_property_sanitize(priv->dev, "aspeed,addr-timing", +> > + 0, ASPEED_PECI_ADDR_TIMING_MAX, +> > + ASPEED_PECI_ADDR_TIMING_DEFAULT, > &priv->addr_timing); > > Use the bus-frequency to replace the property above: -> ??????? aspeed_peci_property_sanitize(priv->dev, "bus-frequency", -> ????????????????????????????????ASPEED_PECI_BUS_FREQUENCY_MIN, +> aspeed_peci_property_sanitize(priv->dev, "bus-frequency", +> ASPEED_PECI_BUS_FREQUENCY_MIN, > ASPEED_PECI_BUS_FREQUENCY_MAX, -> ????????????????????????????????ASPEED_PECI_BUS_FREQUENCY_DEFAULT, &priv- +> ASPEED_PECI_BUS_FREQUENCY_DEFAULT, &priv- > >bus_freq); > -> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, "aspeed,rd-sampling- +> > + aspeed_peci_property_sanitize(priv->dev, "aspeed,rd-sampling- > point", -> ??? >?? +???????????????????????????????????? 0, +> > + 0, > ASPEED_PECI_RD_SAMPLING_POINT_MAX, -> ??? >?? +???????????????????????????????????? +> > + > ASPEED_PECI_RD_SAMPLING_POINT_DEFAULT, -> ??? >?? +???????????????????????????????????? &priv->rd_sampling_point); -> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, "cmd-timeout-ms", -> ??? >?? +???????????????????????????????????? 1, +> > + &priv->rd_sampling_point); +> > + aspeed_peci_property_sanitize(priv->dev, "cmd-timeout-ms", +> > + 1, > ASPEED_PECI_CMD_TIMEOUT_MS_MAX, -> ??? >?? +???????????????????????????????????? +> > + > ASPEED_PECI_CMD_TIMEOUT_MS_DEFAULT, &priv->cmd_timeout_ms); -> ??? >?? +} +> > +} > Add the function of automatically calculating the settings to adapt to the bus > frequency. @@ -149,173 +149,178 @@ presenting this as what it actually is (a "custom" clock divider). Thanks -Iwona -> ??????? static void aspeed_peci_bus_freq_setup(struct aspeed_peci *priv) -> ??????? { -> ??????????????? unsigned long src_clk_rate; -> ??????????????? int delta_value, delta_tmp, clk_divisor, clk_divisor_tmp; -> ??????????????? u32 msg_timing, clk_div; +> static void aspeed_peci_bus_freq_setup(struct aspeed_peci *priv) +> { +> unsigned long src_clk_rate; +> int delta_value, delta_tmp, clk_divisor, clk_divisor_tmp; +> u32 msg_timing, clk_div; > -> ??????????????? src_clk_rate = clk_get_rate(priv->clk); +> src_clk_rate = clk_get_rate(priv->clk); > -> ??????????????? /* -> ???????????????? * PECI bus freq? = (source clk rate) / (4 * +> /* +> * PECI bus freq = (source clk rate) / (4 * > (PECI04[15:8]*4+1) * (1 << PECI00[10:8])) -> ???????????????? * (1 << PECI00[10:8]) * (PECI04[15:8]*4+1) = (source clk +> * (1 << PECI00[10:8]) * (PECI04[15:8]*4+1) = (source clk > rate) / (4 * PECI bus freq ) -> ???????????????? */ -> ??????????????? clk_divisor = src_clk_rate / (4 * priv->bus_freq); -> ??????????????? delta_value = clk_divisor; -> ??????????????? /* Find the closest divisor for bus-frequency */ -> ??????????????? for (msg_timing = 1; msg_timing <= 255; msg_timing++) -> ??????????????????????? for (clk_div = 0; clk_div < 7; -> ??????????????????????????????? clk_div++) { -> ??????????????????????????????? clk_divisor_tmp = (1 << clk_div) * -> ??????????????????????????????????????????????? (msg_timing * 4 + 1); -> ??????????????????????????????? delta_tmp = abs(clk_divisor - +> */ +> clk_divisor = src_clk_rate / (4 * priv->bus_freq); +> delta_value = clk_divisor; +> /* Find the closest divisor for bus-frequency */ +> for (msg_timing = 1; msg_timing <= 255; msg_timing++) +> for (clk_div = 0; clk_div < 7; +> clk_div++) { +> clk_divisor_tmp = (1 << clk_div) * +> (msg_timing * 4 + 1); +> delta_tmp = abs(clk_divisor - > clk_divisor_tmp); -> ??????????????????????????????? if (delta_tmp < delta_value) { -> ??????????????????????????????????????? delta_value = delta_tmp; -> ??????????????????????????????????????? priv->msg_timing = msg_timing; -> ??????????????????????????????????????? priv->addr_timing = priv->msg_timing; -> ??????????????????????????????????????? priv->clk_div = clk_div; -> ??????????????????????????????? } -> ??????????????????????? } -> ??????? } +> if (delta_tmp < delta_value) { +> delta_value = delta_tmp; +> priv->msg_timing = msg_timing; +> priv->addr_timing = priv->msg_timing; +> priv->clk_div = clk_div; +> } +> } +> } > -> ??? >?? + -> ??? >?? +static struct peci_controller_ops aspeed_ops = { -> ??? >?? +???????.xfer = aspeed_peci_xfer, -> ??? >?? +}; -> ??? >?? + -> ??? >?? +static void aspeed_peci_reset_control_release(void *data) -> ??? >?? +{ -> ??? >?? +???????reset_control_assert(data); -> ??? >?? +} -> ??? >?? + -> ??? >?? +static int devm_aspeed_peci_reset_control_deassert(struct device +> > + +> > +static struct peci_controller_ops aspeed_ops = { +> > + .xfer = aspeed_peci_xfer, +> > +}; +> > + +> > +static void aspeed_peci_reset_control_release(void *data) +> > +{ +> > + reset_control_assert(data); +> > +} +> > + +> > +static int devm_aspeed_peci_reset_control_deassert(struct device > *dev, struct reset_control *rst) -> ??? >?? +{ -> ??? >?? +???????int ret; -> ??? >?? + -> ??? >?? +???????ret = reset_control_deassert(rst); -> ??? >?? +???????if (ret) -> ??? >?? +???????????????return ret; -> ??? >?? + -> ??? >?? +???????return devm_add_action_or_reset(dev, +> > +{ +> > + int ret; +> > + +> > + ret = reset_control_deassert(rst); +> > + if (ret) +> > + return ret; +> > + +> > + return devm_add_action_or_reset(dev, > aspeed_peci_reset_control_release, rst); -> ??? >?? +} -> ??? >?? + -> ??? >?? +static void aspeed_peci_clk_release(void *data) -> ??? >?? +{ -> ??? >?? +???????clk_disable_unprepare(data); -> ??? >?? +} -> ??? >?? + -> ??? >?? +static int devm_aspeed_peci_clk_enable(struct device *dev, struct clk +> > +} +> > + +> > +static void aspeed_peci_clk_release(void *data) +> > +{ +> > + clk_disable_unprepare(data); +> > +} +> > + +> > +static int devm_aspeed_peci_clk_enable(struct device *dev, struct clk > *clk) -> ??? >?? +{ -> ??? >?? +???????int ret; -> ??? >?? + -> ??? >?? +???????ret = clk_prepare_enable(clk); -> ??? >?? +???????if (ret) -> ??? >?? +???????????????return ret; -> ??? >?? + -> ??? >?? +???????return devm_add_action_or_reset(dev, aspeed_peci_clk_release, +> > +{ +> > + int ret; +> > + +> > + ret = clk_prepare_enable(clk); +> > + if (ret) +> > + return ret; +> > + +> > + return devm_add_action_or_reset(dev, aspeed_peci_clk_release, > clk); -> ??? >?? +} -> ??? >?? + -> ??? >?? +static int aspeed_peci_probe(struct platform_device *pdev) -> ??? >?? +{ -> ??? >?? +???????struct peci_controller *controller; -> ??? >?? +???????struct aspeed_peci *priv; -> ??? >?? +???????int ret; -> ??? >?? + -> ??? >?? +???????priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); -> ??? >?? +???????if (!priv) -> ??? >?? +???????????????return -ENOMEM; -> ??? >?? + -> ??? >?? +???????priv->dev = &pdev->dev; -> ??? >?? +???????dev_set_drvdata(priv->dev, priv); -> ??? >?? + -> ??? >?? +???????priv->base = devm_platform_ioremap_resource(pdev, 0); -> ??? >?? +???????if (IS_ERR(priv->base)) -> ??? >?? +???????????????return PTR_ERR(priv->base); -> ??? >?? + -> ??? >?? +???????priv->irq = platform_get_irq(pdev, 0); -> ??? >?? +???????if (!priv->irq) -> ??? >?? +???????????????return priv->irq; -> ??? >?? + -> ??? >?? +???????ret = devm_request_irq(&pdev->dev, priv->irq, +> > +} +> > + +> > +static int aspeed_peci_probe(struct platform_device *pdev) +> > +{ +> > + struct peci_controller *controller; +> > + struct aspeed_peci *priv; +> > + int ret; +> > + +> > + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); +> > + if (!priv) +> > + return -ENOMEM; +> > + +> > + priv->dev = &pdev->dev; +> > + dev_set_drvdata(priv->dev, priv); +> > + +> > + priv->base = devm_platform_ioremap_resource(pdev, 0); +> > + if (IS_ERR(priv->base)) +> > + return PTR_ERR(priv->base); +> > + +> > + priv->irq = platform_get_irq(pdev, 0); +> > + if (!priv->irq) +> > + return priv->irq; +> > + +> > + ret = devm_request_irq(&pdev->dev, priv->irq, > aspeed_peci_irq_handler, -> ??? >?? +????????????????????????????? 0, "peci-aspeed", priv); -> ??? >?? +???????if (ret) -> ??? >?? +???????????????return ret; -> ??? >?? + -> ??? >?? +???????init_completion(&priv->xfer_complete); -> ??? >?? +???????spin_lock_init(&priv->lock); -> ??? >?? + -> ??? >?? +???????priv->rst = devm_reset_control_get(&pdev->dev, NULL); -> ??? >?? +???????if (IS_ERR(priv->rst)) -> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(priv->rst), -> ??? >?? +??????????????????????????????????? "failed to get reset control\n"); -> ??? >?? + -> ??? >?? +???????ret = devm_aspeed_peci_reset_control_deassert(priv->dev, priv- +> > + 0, "peci-aspeed", priv); +> > + if (ret) +> > + return ret; +> > + +> > + init_completion(&priv->xfer_complete); +> > + spin_lock_init(&priv->lock); +> > + +> > + priv->rst = devm_reset_control_get(&pdev->dev, NULL); +> > + if (IS_ERR(priv->rst)) +> > + return dev_err_probe(priv->dev, PTR_ERR(priv->rst), +> > + "failed to get reset control\n"); +> > + +> > + ret = devm_aspeed_peci_reset_control_deassert(priv->dev, priv- > >rst); -> ??? >?? +???????if (ret) -> ??? >?? +???????????????return dev_err_probe(priv->dev, ret, "cannot deassert +> > + if (ret) +> > + return dev_err_probe(priv->dev, ret, "cannot deassert > reset control\n"); -> ??? >?? + -> ??? >?? +???????priv->clk = devm_clk_get(priv->dev, NULL); -> ??? >?? +???????if (IS_ERR(priv->clk)) -> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(priv->clk), +> > + +> > + priv->clk = devm_clk_get(priv->dev, NULL); +> > + if (IS_ERR(priv->clk)) +> > + return dev_err_probe(priv->dev, PTR_ERR(priv->clk), > "failed to get clk\n"); -> ??? >?? + -> ??? >?? +???????ret = devm_aspeed_peci_clk_enable(priv->dev, priv->clk); -> ??? >?? +???????if (ret) -> ??? >?? +???????????????return dev_err_probe(priv->dev, ret, "failed to enable +> > + +> > + ret = devm_aspeed_peci_clk_enable(priv->dev, priv->clk); +> > + if (ret) +> > + return dev_err_probe(priv->dev, ret, "failed to enable > clock\n"); -> ??? >?? + -> ??? >?? +???????aspeed_peci_property_setup(priv); +> > + +> > + aspeed_peci_property_setup(priv); > -> ??????? aspeed_peci_bus_freq_setup(priv); +> aspeed_peci_bus_freq_setup(priv); > -> ??? >?? + -> ??? >?? +???????aspeed_peci_init_regs(priv); -> ??? >?? + -> ??? >?? +???????controller = devm_peci_controller_add(priv->dev, &aspeed_ops); -> ??? >?? +???????if (IS_ERR(controller)) -> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(controller), -> ??? >?? +??????????????????????????????????? "failed to add aspeed peci +> > + +> > + aspeed_peci_init_regs(priv); +> > + +> > + controller = devm_peci_controller_add(priv->dev, &aspeed_ops); +> > + if (IS_ERR(controller)) +> > + return dev_err_probe(priv->dev, PTR_ERR(controller), +> > + "failed to add aspeed peci > controller\n"); -> ??? >?? + -> ??? >?? +???????priv->controller = controller; -> ??? >?? + -> ??? >?? +???????return 0; -> ??? >?? +} -> ??? >?? + -> ??? >?? +static const struct of_device_id aspeed_peci_of_table[] = { -> ??? >?? +???????{ .compatible = "aspeed,ast2400-peci", }, -> ??? >?? +???????{ .compatible = "aspeed,ast2500-peci", }, -> ??? >?? +???????{ .compatible = "aspeed,ast2600-peci", }, -> ??? >?? +???????{ } -> ??? >?? +}; -> ??? >?? +MODULE_DEVICE_TABLE(of, aspeed_peci_of_table); -> ??? >?? + -> ??? >?? +static struct platform_driver aspeed_peci_driver = { -> ??? >?? +???????.probe? = aspeed_peci_probe, -> ??? >?? +???????.driver = { -> ??? >?? +???????????????.name?????????? = "peci-aspeed", -> ??? >?? +???????????????.of_match_table = aspeed_peci_of_table, -> ??? >?? +???????}, -> ??? >?? +}; -> ??? >?? +module_platform_driver(aspeed_peci_driver); -> ??? >?? + -> ??? >?? +MODULE_AUTHOR("Ryan Chen <ryan_chen@aspeedtech.com>"); -> ??? >?? +MODULE_AUTHOR("Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>"); -> ??? >?? +MODULE_DESCRIPTION("ASPEED PECI driver"); -> ??? >?? +MODULE_LICENSE("GPL"); -> ??? >?? +MODULE_IMPORT_NS(PECI); -> ??? >?? -- -> ??? >?? 2.31.1 +> > + +> > + priv->controller = controller; +> > + +> > + return 0; +> > +} +> > + +> > +static const struct of_device_id aspeed_peci_of_table[] = { +> > + { .compatible = "aspeed,ast2400-peci", }, +> > + { .compatible = "aspeed,ast2500-peci", }, +> > + { .compatible = "aspeed,ast2600-peci", }, +> > + { } +> > +}; +> > +MODULE_DEVICE_TABLE(of, aspeed_peci_of_table); +> > + +> > +static struct platform_driver aspeed_peci_driver = { +> > + .probe = aspeed_peci_probe, +> > + .driver = { +> > + .name = "peci-aspeed", +> > + .of_match_table = aspeed_peci_of_table, +> > + }, +> > +}; +> > +module_platform_driver(aspeed_peci_driver); +> > + +> > +MODULE_AUTHOR("Ryan Chen <ryan_chen@aspeedtech.com>"); +> > +MODULE_AUTHOR("Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>"); +> > +MODULE_DESCRIPTION("ASPEED PECI driver"); +> > +MODULE_LICENSE("GPL"); +> > +MODULE_IMPORT_NS(PECI); +> > -- +> > 2.31.1 > > -> +> + +_______________________________________________ +linux-arm-kernel mailing list +linux-arm-kernel@lists.infradead.org +http://lists.infradead.org/mailman/listinfo/linux-arm-kernel diff --git a/a/content_digest b/N3/content_digest index c3e1dab..87ff150 100644 --- a/a/content_digest +++ b/N3/content_digest @@ -2,9 +2,36 @@ "ref\020211123140706.2945700-6-iwona.winiarska@intel.com\0" "ref\071D27F36-8BB7-4C30-99C5-CCA4F9A30945@aspeedtech.com\0" "From\0Winiarska, Iwona <iwona.winiarska@intel.com>\0" - "Subject\0[PATCH v4 05/13] peci: Add peci-aspeed controller driver\0" + "Subject\0Re: [PATCH v4 05/13] peci: Add peci-aspeed controller driver\0" "Date\0Tue, 7 Dec 2021 18:09:36 +0000\0" - "To\0linux-aspeed@lists.ozlabs.org\0" + "To\0billy_tsai@aspeedtech.com <billy_tsai@aspeedtech.com>" + gregkh@linuxfoundation.org <gregkh@linuxfoundation.org> + linux-kernel@vger.kernel.org <linux-kernel@vger.kernel.org> + " openbmc@lists.ozlabs.org <openbmc@lists.ozlabs.org>\0" + "Cc\0corbet@lwn.net <corbet@lwn.net>" + jae.hyun.yoo@linux.intel.com <jae.hyun.yoo@linux.intel.com> + linux-hwmon@vger.kernel.org <linux-hwmon@vger.kernel.org> + andrew@aj.id.au <andrew@aj.id.au> + Hansen + Dave <dave.hansen@intel.com> + Luck + Tony <tony.luck@intel.com> + jdelvare@suse.com <jdelvare@suse.com> + olof@lixom.net <olof@lixom.net> + rdunlap@infradead.org <rdunlap@infradead.org> + devicetree@vger.kernel.org <devicetree@vger.kernel.org> + linux-aspeed@lists.ozlabs.org <linux-aspeed@lists.ozlabs.org> + linux@roeck-us.net <linux@roeck-us.net> + arnd@arndb.de <arnd@arndb.de> + linux-doc@vger.kernel.org <linux-doc@vger.kernel.org> + robh+dt@kernel.org <robh+dt@kernel.org> + zweiss@equinix.com <zweiss@equinix.com> + bp@alien8.de <bp@alien8.de> + linux-arm-kernel@lists.infradead.org <linux-arm-kernel@lists.infradead.org> + pierre-louis.bossart@linux.intel.com <pierre-louis.bossart@linux.intel.com> + andriy.shevchenko@linux.intel.com <andriy.shevchenko@linux.intel.com> + Williams + " Dan J <dan.j.williams@intel.com>\0" "\00:1\0" "b\0" "On Mon, 2021-12-06 at 05:27 +0000, Billy Tsai wrote:\n" @@ -14,82 +41,82 @@ "> reply inline.\n" "> \n" "> On 2021/11/23, 10:11 PM, \"openbmc on behalf of Iwona Winiarska\"\n" - "> <openbmc-bounces+billy_tsai=aspeedtech.com@lists.ozlabs.org?on behalf of\n" - "> iwona.winiarska at intel.com> wrote:\n" + "> <openbmc-bounces+billy_tsai=aspeedtech.com@lists.ozlabs.org\302\240on behalf of\n" + "> iwona.winiarska@intel.com> wrote:\n" "> \n" - "> ??? >?? From: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>\n" + "> \302\240\302\240\302\240 >\302\240\302\240 From: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>\n" "> Add the define for the bus frequency\n" - "> ??????? #define ASPEED_PECI_BUS_FREQUENCY_MIN???????????2000\n" - "> ??????? #define ASPEED_PECI_BUS_FREQUENCY_DEFAULT???????2000\n" - "> ??????? #define ASPEED_PECI_BUS_FREQUENCY_MAX???????????1000000\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 #define ASPEED_PECI_BUS_FREQUENCY_MIN\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2402000\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 #define ASPEED_PECI_BUS_FREQUENCY_DEFAULT\302\240\302\240\302\240\302\240\302\240\302\240\302\2402000\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 #define ASPEED_PECI_BUS_FREQUENCY_MAX\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2401000000\n" "> \n" - "> ?? >?? +struct aspeed_peci {\n" - "> ??? >?? +???????struct peci_controller *controller;\n" - "> ??? >?? +???????struct device *dev;\n" - "> ??? >?? +???????void __iomem *base;\n" - "> ??? >?? +???????struct clk *clk;\n" - "> ??? >?? +???????struct reset_control *rst;\n" - "> ??? >?? +???????int irq;\n" - "> ??? >?? +???????spinlock_t lock; /* to sync completion status handling */\n" - "> ??? >?? +???????struct completion xfer_complete;\n" - "> ??? >?? +???????u32 status;\n" - "> ??? >?? +???????u32 cmd_timeout_ms;\n" - "> ??? >?? +???????u32 msg_timing;\n" - "> ??? >?? +???????u32 addr_timing;\n" - "> ??? >?? +???????u32 rd_sampling_point;\n" - "> ??? >?? +???????u32 clk_div;\n" + "> \302\240\302\240 >\302\240\302\240 +struct aspeed_peci {\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_controller *controller;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct device *dev;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240void __iomem *base;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct clk *clk;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct reset_control *rst;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int irq;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240spinlock_t lock; /* to sync completion status handling */\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct completion xfer_complete;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 status;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 cmd_timeout_ms;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 msg_timing;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 addr_timing;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 rd_sampling_point;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 clk_div;\n" "> \n" "> Add the paremeter to store the bus_freq from the dts property\n" - "> ??????? u32 bus_freq;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 u32 bus_freq;\n" "> \n" - "> ??? >?? +};\n" - "> ??? >?? +\n" - "> ??? >?? +static void aspeed_peci_init_regs(struct aspeed_peci *priv)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????u32 val;\n" - "> ??? >?? +\n" - "> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +};\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static void aspeed_peci_init_regs(struct aspeed_peci *priv)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 val;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val = FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK,\n" "> ASPEED_PECI_CLK_DIV_DEFAULT);\n" - "> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_CLK_EN;\n" - "> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_CTRL);\n" - "> ??? >?? +???????/*\n" - "> ??? >?? +??????? * Timing negotiation period setting.\n" - "> ??? >?? +??????? * The unit of the programmed value is 4 times of PECI clock\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= ASPEED_PECI_CTRL_PECI_CLK_EN;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240writel(val, priv->base + ASPEED_PECI_CTRL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240/*\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240 * Timing negotiation period setting.\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240 * The unit of the programmed value is 4 times of PECI clock\n" "> period.\n" - "> ??? >?? +??????? */\n" - "> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_T_NEGO_MSG_MASK, priv-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240 */\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val = FIELD_PREP(ASPEED_PECI_T_NEGO_MSG_MASK, priv-\n" "> >msg_timing);\n" - "> ??? >?? +???????val |= FIELD_PREP(ASPEED_PECI_T_NEGO_ADDR_MASK, priv-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= FIELD_PREP(ASPEED_PECI_T_NEGO_ADDR_MASK, priv-\n" "> >addr_timing);\n" - "> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_TIMING_NEGOTIATION);\n" - "> ??? >?? +\n" - "> ??? >?? +???????/* Clear interrupts */\n" - "> ??? >?? +???????val = readl(priv->base + ASPEED_PECI_INT_STS) |\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240writel(val, priv->base + ASPEED_PECI_TIMING_NEGOTIATION);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240/* Clear interrupts */\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val = readl(priv->base + ASPEED_PECI_INT_STS) |\n" "> ASPEED_PECI_INT_MASK;\n" - "> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_INT_STS);\n" - "> ??? >?? +\n" - "> ??? >?? +???????/* Set timing negotiation mode and enable interrupts */\n" - "> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_TIMING_NEGO_SEL_MASK,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240writel(val, priv->base + ASPEED_PECI_INT_STS);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240/* Set timing negotiation mode and enable interrupts */\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val = FIELD_PREP(ASPEED_PECI_TIMING_NEGO_SEL_MASK,\n" "> ASPEED_PECI_1ST_BIT_OF_ADDR_NEGO);\n" - "> ??? >?? +???????val |= ASPEED_PECI_INT_MASK;\n" - "> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_INT_CTRL);\n" - "> ??? >?? +\n" - "> ??? >?? +???????val = FIELD_PREP(ASPEED_PECI_CTRL_SAMPLING_MASK, priv-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= ASPEED_PECI_INT_MASK;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240writel(val, priv->base + ASPEED_PECI_INT_CTRL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val = FIELD_PREP(ASPEED_PECI_CTRL_SAMPLING_MASK, priv-\n" "> >rd_sampling_point);\n" - "> ??? >?? +???????val |= FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, priv-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= FIELD_PREP(ASPEED_PECI_CTRL_CLK_DIV_MASK, priv-\n" "> >clk_div);\n" - "> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_EN;\n" - "> ??? >?? +???????val |= ASPEED_PECI_CTRL_PECI_CLK_EN;\n" - "> ??? >?? +???????writel(val, priv->base + ASPEED_PECI_CTRL);\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static inline int aspeed_peci_check_idle(struct aspeed_peci *priv)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????u32 cmd_sts = readl(priv->base + ASPEED_PECI_CMD);\n" - "> ??? >?? +\n" - "> ??? >?? +???????if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts) ==\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= ASPEED_PECI_CTRL_PECI_EN;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240val |= ASPEED_PECI_CTRL_PECI_CLK_EN;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240writel(val, priv->base + ASPEED_PECI_CTRL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static inline int aspeed_peci_check_idle(struct aspeed_peci *priv)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 cmd_sts = readl(priv->base + ASPEED_PECI_CMD);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts) ==\n" "> ASPEED_PECI_CMD_STS_ADDR_T_NEGO)\n" - "> ??? >?? +???????????????aspeed_peci_init_regs(priv);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_init_regs(priv);\n" "> \n" "> As long as the state is not idle, the controller need to reinitialize the PECI\n" "> register for solving the PECI controller hang.\n" @@ -97,11 +124,11 @@ "> the hang issue.\n" "> For backward compatible, I suggest to add the reset assert/de-assert in this\n" "> place.\n" - "> ??????? if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts)) {\n" - "> ??????????????????????? reset_control_assert(priv->rst);\n" - "> ??????????????????????? reset_control_deassert(priv->rst);\n" - "> ??????????????????????? aspeed_peci_init_regs(priv);\n" - "> ??????? }\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 if (FIELD_GET(ASPEED_PECI_CMD_STS_MASK, cmd_sts)) {\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 reset_control_assert(priv->rst);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 reset_control_deassert(priv->rst);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 aspeed_peci_init_regs(priv);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 }\n" "\n" "Ack.\n" "\n" @@ -109,42 +136,42 @@ "\n" "(...)\n" "\n" - "> ??? >?? +static void aspeed_peci_property_setup(struct aspeed_peci *priv)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, \"aspeed,clock-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static void aspeed_peci_property_setup(struct aspeed_peci *priv)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_sanitize(priv->dev, \"aspeed,clock-\n" "> divider\",\n" - "> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_CLK_DIV_MAX,\n" - "> ??? >?? +???????????????????????????????????? ASPEED_PECI_CLK_DIV_DEFAULT,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 0, ASPEED_PECI_CLK_DIV_MAX,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 ASPEED_PECI_CLK_DIV_DEFAULT,\n" "> &priv->clk_div);\n" - "> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, \"aspeed,msg-timing\",\n" - "> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_MSG_TIMING_MAX,\n" - "> ??? >?? +???????????????????????????????????? ASPEED_PECI_MSG_TIMING_DEFAULT,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_sanitize(priv->dev, \"aspeed,msg-timing\",\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 0, ASPEED_PECI_MSG_TIMING_MAX,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 ASPEED_PECI_MSG_TIMING_DEFAULT,\n" "> &priv->msg_timing);\n" - "> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, \"aspeed,addr-timing\",\n" - "> ??? >?? +???????????????????????????????????? 0, ASPEED_PECI_ADDR_TIMING_MAX,\n" - "> ??? >?? +???????????????????????????????????? ASPEED_PECI_ADDR_TIMING_DEFAULT,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_sanitize(priv->dev, \"aspeed,addr-timing\",\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 0, ASPEED_PECI_ADDR_TIMING_MAX,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 ASPEED_PECI_ADDR_TIMING_DEFAULT,\n" "> &priv->addr_timing);\n" "> \n" "> Use the bus-frequency to replace the property above:\n" - "> ??????? aspeed_peci_property_sanitize(priv->dev, \"bus-frequency\",\n" - "> ????????????????????????????????ASPEED_PECI_BUS_FREQUENCY_MIN,\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 aspeed_peci_property_sanitize(priv->dev, \"bus-frequency\",\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ASPEED_PECI_BUS_FREQUENCY_MIN,\n" "> ASPEED_PECI_BUS_FREQUENCY_MAX,\n" - "> ????????????????????????????????ASPEED_PECI_BUS_FREQUENCY_DEFAULT, &priv-\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ASPEED_PECI_BUS_FREQUENCY_DEFAULT, &priv-\n" "> >bus_freq);\n" "> \n" - "> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, \"aspeed,rd-sampling-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_sanitize(priv->dev, \"aspeed,rd-sampling-\n" "> point\",\n" - "> ??? >?? +???????????????????????????????????? 0,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 0,\n" "> ASPEED_PECI_RD_SAMPLING_POINT_MAX,\n" - "> ??? >?? +????????????????????????????????????\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\n" "> ASPEED_PECI_RD_SAMPLING_POINT_DEFAULT,\n" - "> ??? >?? +???????????????????????????????????? &priv->rd_sampling_point);\n" - "> ??? >?? +???????aspeed_peci_property_sanitize(priv->dev, \"cmd-timeout-ms\",\n" - "> ??? >?? +???????????????????????????????????? 1,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 &priv->rd_sampling_point);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_sanitize(priv->dev, \"cmd-timeout-ms\",\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 1,\n" "> ASPEED_PECI_CMD_TIMEOUT_MS_MAX,\n" - "> ??? >?? +????????????????????????????????????\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\n" "> ASPEED_PECI_CMD_TIMEOUT_MS_DEFAULT, &priv->cmd_timeout_ms);\n" - "> ??? >?? +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" "> Add the function of automatically calculating the settings to adapt to the bus\n" "> frequency.\n" "\n" @@ -158,175 +185,180 @@ "Thanks\n" "-Iwona\n" "\n" - "> ??????? static void aspeed_peci_bus_freq_setup(struct aspeed_peci *priv)\n" - "> ??????? {\n" - "> ??????????????? unsigned long src_clk_rate;\n" - "> ??????????????? int delta_value, delta_tmp, clk_divisor, clk_divisor_tmp;\n" - "> ??????????????? u32 msg_timing, clk_div;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 static void aspeed_peci_bus_freq_setup(struct aspeed_peci *priv)\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 {\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 unsigned long src_clk_rate;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 int delta_value, delta_tmp, clk_divisor, clk_divisor_tmp;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 u32 msg_timing, clk_div;\n" "> \n" - "> ??????????????? src_clk_rate = clk_get_rate(priv->clk);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 src_clk_rate = clk_get_rate(priv->clk);\n" "> \n" - "> ??????????????? /*\n" - "> ???????????????? * PECI bus freq? = (source clk rate) / (4 *\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 /*\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 * PECI bus freq\302\240 = (source clk rate) / (4 *\n" "> (PECI04[15:8]*4+1) * (1 << PECI00[10:8]))\n" - "> ???????????????? * (1 << PECI00[10:8]) * (PECI04[15:8]*4+1) = (source clk\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 * (1 << PECI00[10:8]) * (PECI04[15:8]*4+1) = (source clk\n" "> rate) / (4 * PECI bus freq )\n" - "> ???????????????? */\n" - "> ??????????????? clk_divisor = src_clk_rate / (4 * priv->bus_freq);\n" - "> ??????????????? delta_value = clk_divisor;\n" - "> ??????????????? /* Find the closest divisor for bus-frequency */\n" - "> ??????????????? for (msg_timing = 1; msg_timing <= 255; msg_timing++)\n" - "> ??????????????????????? for (clk_div = 0; clk_div < 7;\n" - "> ??????????????????????????????? clk_div++) {\n" - "> ??????????????????????????????? clk_divisor_tmp = (1 << clk_div) *\n" - "> ??????????????????????????????????????????????? (msg_timing * 4 + 1);\n" - "> ??????????????????????????????? delta_tmp = abs(clk_divisor -\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 */\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 clk_divisor = src_clk_rate / (4 * priv->bus_freq);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 delta_value = clk_divisor;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 /* Find the closest divisor for bus-frequency */\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 for (msg_timing = 1; msg_timing <= 255; msg_timing++)\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 for (clk_div = 0; clk_div < 7;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 clk_div++) {\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 clk_divisor_tmp = (1 << clk_div) *\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 (msg_timing * 4 + 1);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 delta_tmp = abs(clk_divisor -\n" "> clk_divisor_tmp);\n" - "> ??????????????????????????????? if (delta_tmp < delta_value) {\n" - "> ??????????????????????????????????????? delta_value = delta_tmp;\n" - "> ??????????????????????????????????????? priv->msg_timing = msg_timing;\n" - "> ??????????????????????????????????????? priv->addr_timing = priv->msg_timing;\n" - "> ??????????????????????????????????????? priv->clk_div = clk_div;\n" - "> ??????????????????????????????? }\n" - "> ??????????????????????? }\n" - "> ??????? }\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 if (delta_tmp < delta_value) {\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 delta_value = delta_tmp;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 priv->msg_timing = msg_timing;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 priv->addr_timing = priv->msg_timing;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 priv->clk_div = clk_div;\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 }\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 }\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 }\n" "> \n" - "> ??? >?? +\n" - "> ??? >?? +static struct peci_controller_ops aspeed_ops = {\n" - "> ??? >?? +???????.xfer = aspeed_peci_xfer,\n" - "> ??? >?? +};\n" - "> ??? >?? +\n" - "> ??? >?? +static void aspeed_peci_reset_control_release(void *data)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????reset_control_assert(data);\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static int devm_aspeed_peci_reset_control_deassert(struct device\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static struct peci_controller_ops aspeed_ops = {\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.xfer = aspeed_peci_xfer,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +};\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static void aspeed_peci_reset_control_release(void *data)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240reset_control_assert(data);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static int devm_aspeed_peci_reset_control_deassert(struct device\n" "> *dev, struct reset_control *rst)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????int ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????ret = reset_control_deassert(rst);\n" - "> ??? >?? +???????if (ret)\n" - "> ??? >?? +???????????????return ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????return devm_add_action_or_reset(dev,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = reset_control_deassert(rst);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return devm_add_action_or_reset(dev,\n" "> aspeed_peci_reset_control_release, rst);\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static void aspeed_peci_clk_release(void *data)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????clk_disable_unprepare(data);\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static int devm_aspeed_peci_clk_enable(struct device *dev, struct clk\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static void aspeed_peci_clk_release(void *data)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_disable_unprepare(data);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static int devm_aspeed_peci_clk_enable(struct device *dev, struct clk\n" "> *clk)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????int ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????ret = clk_prepare_enable(clk);\n" - "> ??? >?? +???????if (ret)\n" - "> ??? >?? +???????????????return ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????return devm_add_action_or_reset(dev, aspeed_peci_clk_release,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = clk_prepare_enable(clk);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return devm_add_action_or_reset(dev, aspeed_peci_clk_release,\n" "> clk);\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static int aspeed_peci_probe(struct platform_device *pdev)\n" - "> ??? >?? +{\n" - "> ??? >?? +???????struct peci_controller *controller;\n" - "> ??? >?? +???????struct aspeed_peci *priv;\n" - "> ??? >?? +???????int ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);\n" - "> ??? >?? +???????if (!priv)\n" - "> ??? >?? +???????????????return -ENOMEM;\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->dev = &pdev->dev;\n" - "> ??? >?? +???????dev_set_drvdata(priv->dev, priv);\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->base = devm_platform_ioremap_resource(pdev, 0);\n" - "> ??? >?? +???????if (IS_ERR(priv->base))\n" - "> ??? >?? +???????????????return PTR_ERR(priv->base);\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->irq = platform_get_irq(pdev, 0);\n" - "> ??? >?? +???????if (!priv->irq)\n" - "> ??? >?? +???????????????return priv->irq;\n" - "> ??? >?? +\n" - "> ??? >?? +???????ret = devm_request_irq(&pdev->dev, priv->irq,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static int aspeed_peci_probe(struct platform_device *pdev)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +{\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_controller *controller;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct aspeed_peci *priv;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!priv)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -ENOMEM;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->dev = &pdev->dev;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240dev_set_drvdata(priv->dev, priv);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->base = devm_platform_ioremap_resource(pdev, 0);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(priv->base))\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return PTR_ERR(priv->base);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->irq = platform_get_irq(pdev, 0);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!priv->irq)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return priv->irq;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = devm_request_irq(&pdev->dev, priv->irq,\n" "> aspeed_peci_irq_handler,\n" - "> ??? >?? +????????????????????????????? 0, \"peci-aspeed\", priv);\n" - "> ??? >?? +???????if (ret)\n" - "> ??? >?? +???????????????return ret;\n" - "> ??? >?? +\n" - "> ??? >?? +???????init_completion(&priv->xfer_complete);\n" - "> ??? >?? +???????spin_lock_init(&priv->lock);\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->rst = devm_reset_control_get(&pdev->dev, NULL);\n" - "> ??? >?? +???????if (IS_ERR(priv->rst))\n" - "> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(priv->rst),\n" - "> ??? >?? +??????????????????????????????????? \"failed to get reset control\\n\");\n" - "> ??? >?? +\n" - "> ??? >?? +???????ret = devm_aspeed_peci_reset_control_deassert(priv->dev, priv-\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 0, \"peci-aspeed\", priv);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240init_completion(&priv->xfer_complete);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240spin_lock_init(&priv->lock);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->rst = devm_reset_control_get(&pdev->dev, NULL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(priv->rst))\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return dev_err_probe(priv->dev, PTR_ERR(priv->rst),\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 \"failed to get reset control\\n\");\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = devm_aspeed_peci_reset_control_deassert(priv->dev, priv-\n" "> >rst);\n" - "> ??? >?? +???????if (ret)\n" - "> ??? >?? +???????????????return dev_err_probe(priv->dev, ret, \"cannot deassert\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return dev_err_probe(priv->dev, ret, \"cannot deassert\n" "> reset control\\n\");\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->clk = devm_clk_get(priv->dev, NULL);\n" - "> ??? >?? +???????if (IS_ERR(priv->clk))\n" - "> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(priv->clk),\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->clk = devm_clk_get(priv->dev, NULL);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(priv->clk))\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return dev_err_probe(priv->dev, PTR_ERR(priv->clk),\n" "> \"failed to get clk\\n\");\n" - "> ??? >?? +\n" - "> ??? >?? +???????ret = devm_aspeed_peci_clk_enable(priv->dev, priv->clk);\n" - "> ??? >?? +???????if (ret)\n" - "> ??? >?? +???????????????return dev_err_probe(priv->dev, ret, \"failed to enable\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = devm_aspeed_peci_clk_enable(priv->dev, priv->clk);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return dev_err_probe(priv->dev, ret, \"failed to enable\n" "> clock\\n\");\n" - "> ??? >?? +\n" - "> ??? >?? +???????aspeed_peci_property_setup(priv);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_property_setup(priv);\n" "> \n" - "> ??????? aspeed_peci_bus_freq_setup(priv);\n" + "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240 aspeed_peci_bus_freq_setup(priv);\n" "> \n" - "> ??? >?? +\n" - "> ??? >?? +???????aspeed_peci_init_regs(priv);\n" - "> ??? >?? +\n" - "> ??? >?? +???????controller = devm_peci_controller_add(priv->dev, &aspeed_ops);\n" - "> ??? >?? +???????if (IS_ERR(controller))\n" - "> ??? >?? +???????????????return dev_err_probe(priv->dev, PTR_ERR(controller),\n" - "> ??? >?? +??????????????????????????????????? \"failed to add aspeed peci\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240aspeed_peci_init_regs(priv);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240controller = devm_peci_controller_add(priv->dev, &aspeed_ops);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(controller))\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return dev_err_probe(priv->dev, PTR_ERR(controller),\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 \"failed to add aspeed peci\n" "> controller\\n\");\n" - "> ??? >?? +\n" - "> ??? >?? +???????priv->controller = controller;\n" - "> ??? >?? +\n" - "> ??? >?? +???????return 0;\n" - "> ??? >?? +}\n" - "> ??? >?? +\n" - "> ??? >?? +static const struct of_device_id aspeed_peci_of_table[] = {\n" - "> ??? >?? +???????{ .compatible = \"aspeed,ast2400-peci\", },\n" - "> ??? >?? +???????{ .compatible = \"aspeed,ast2500-peci\", },\n" - "> ??? >?? +???????{ .compatible = \"aspeed,ast2600-peci\", },\n" - "> ??? >?? +???????{ }\n" - "> ??? >?? +};\n" - "> ??? >?? +MODULE_DEVICE_TABLE(of, aspeed_peci_of_table);\n" - "> ??? >?? +\n" - "> ??? >?? +static struct platform_driver aspeed_peci_driver = {\n" - "> ??? >?? +???????.probe? = aspeed_peci_probe,\n" - "> ??? >?? +???????.driver = {\n" - "> ??? >?? +???????????????.name?????????? = \"peci-aspeed\",\n" - "> ??? >?? +???????????????.of_match_table = aspeed_peci_of_table,\n" - "> ??? >?? +???????},\n" - "> ??? >?? +};\n" - "> ??? >?? +module_platform_driver(aspeed_peci_driver);\n" - "> ??? >?? +\n" - "> ??? >?? +MODULE_AUTHOR(\"Ryan Chen <ryan_chen@aspeedtech.com>\");\n" - "> ??? >?? +MODULE_AUTHOR(\"Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>\");\n" - "> ??? >?? +MODULE_DESCRIPTION(\"ASPEED PECI driver\");\n" - "> ??? >?? +MODULE_LICENSE(\"GPL\");\n" - "> ??? >?? +MODULE_IMPORT_NS(PECI);\n" - "> ??? >?? -- \n" - "> ??? >?? 2.31.1\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240priv->controller = controller;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +}\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static const struct of_device_id aspeed_peci_of_table[] = {\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240{ .compatible = \"aspeed,ast2400-peci\", },\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240{ .compatible = \"aspeed,ast2500-peci\", },\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240{ .compatible = \"aspeed,ast2600-peci\", },\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240{ }\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +};\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_DEVICE_TABLE(of, aspeed_peci_of_table);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +static struct platform_driver aspeed_peci_driver = {\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.probe\302\240 = aspeed_peci_probe,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.driver = {\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240.name\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 = \"peci-aspeed\",\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240.of_match_table = aspeed_peci_of_table,\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\302\240\302\240\302\240\302\240\302\240\302\240\302\240},\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +};\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +module_platform_driver(aspeed_peci_driver);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_AUTHOR(\"Ryan Chen <ryan_chen@aspeedtech.com>\");\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_AUTHOR(\"Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>\");\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_DESCRIPTION(\"ASPEED PECI driver\");\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_LICENSE(\"GPL\");\n" + "> \302\240\302\240\302\240 >\302\240\302\240 +MODULE_IMPORT_NS(PECI);\n" + "> \302\240\302\240\302\240 >\302\240\302\240 -- \n" + "> \302\240\302\240\302\240 >\302\240\302\240 2.31.1\n" "> \n" "> \n" - > + "> \n" + "\n" + "_______________________________________________\n" + "linux-arm-kernel mailing list\n" + "linux-arm-kernel@lists.infradead.org\n" + http://lists.infradead.org/mailman/listinfo/linux-arm-kernel -d65c4b1428335a9cbd34f7be1f98049e617e1d21269286d21aa723f17ca92215 +9ca6ede4260b2839eea82e3f375f606bd4bc8fc1d062679f1cef639768e0ab92
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.