Message ID | 20180219072422.22733-1-joel@jms.id.au |
---|---|
Headers | show |
Series | misc: aspeed-lpc-ctrl fixes | expand |
On Mon, 2018-02-19 at 17:54 +1030, Joel Stanley wrote: > To date this driver has relied on prevous state from out of tree hacks > and vendor u-boot trees in order to have the host be able to access > data over the LPC bus. > > Now we explicitly enable the AHB to LPC bridge and FWH cycles from when > the user first configures the address to map. We chose to do this then > as before that time there is no way for the kernel to know where it is > safe to point the LPC window. > > Tested-by: Lei YU <mine260309@gmail.com> > Reviewed-by: Andrew Jeffery <andrew@aj.id.au> > Signed-off-by: Joel Stanley <joel@jms.id.au> Reviewed-by: Cyril Bur <cyrilbur@gmail.com> > --- > drivers/misc/aspeed-lpc-ctrl.c | 18 ++++++++++++++++-- > 1 file changed, 16 insertions(+), 2 deletions(-) > > diff --git a/drivers/misc/aspeed-lpc-ctrl.c b/drivers/misc/aspeed-lpc-ctrl.c > index 1827b7aa6674..a024f8042259 100644 > --- a/drivers/misc/aspeed-lpc-ctrl.c > +++ b/drivers/misc/aspeed-lpc-ctrl.c > @@ -21,6 +21,10 @@ > > #define DEVICE_NAME "aspeed-lpc-ctrl" > > +#define HICR5 0x0 > +#define HICR5_ENL2H BIT(8) > +#define HICR5_ENFWH BIT(10) > + > #define HICR7 0x8 > #define HICR8 0xc > > @@ -155,8 +159,18 @@ static long aspeed_lpc_ctrl_ioctl(struct file *file, unsigned int cmd, > if (rc) > return rc; > > - return regmap_write(lpc_ctrl->regmap, HICR8, > - (~(map.size - 1)) | ((map.size >> 16) - 1)); > + rc = regmap_write(lpc_ctrl->regmap, HICR8, > + (~(map.size - 1)) | ((map.size >> 16) - 1)); > + if (rc) > + return rc; > + > + /* > + * Enable LPC FHW cycles. This is required for the host to > + * access the regions specified. > + */ > + return regmap_update_bits(lpc_ctrl->regmap, HICR5, > + HICR5_ENFWH | HICR5_ENL2H, > + HICR5_ENFWH | HICR5_ENL2H); > } > > return -EINVAL; -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, 2018-02-19 at 17:54 +1030, Joel Stanley wrote: > The LPC device needs to ensure it's clock is enabled before it can do > anything. > > In the past the clock was enabled and left running by u-boot, however > Linux now has an upstream clock driver that disables unused clocks. > > Tested-by: Lei YU <mine260309@gmail.com> > Reviewed-by: Andrew Jeffery <andrew@aj.id.au> > Signed-off-by: Joel Stanley <joel@jms.id.au> Reviewed-by: Cyril Bur <cyrilbur@gmail.com> > --- > drivers/misc/aspeed-lpc-ctrl.c | 26 +++++++++++++++++++++++--- > 1 file changed, 23 insertions(+), 3 deletions(-) > > diff --git a/drivers/misc/aspeed-lpc-ctrl.c b/drivers/misc/aspeed-lpc-ctrl.c > index b5439643f54b..1827b7aa6674 100644 > --- a/drivers/misc/aspeed-lpc-ctrl.c > +++ b/drivers/misc/aspeed-lpc-ctrl.c > @@ -7,6 +7,7 @@ > * 2 of the License, or (at your option) any later version. > */ > > +#include <linux/clk.h> > #include <linux/mfd/syscon.h> > #include <linux/miscdevice.h> > #include <linux/mm.h> > @@ -26,6 +27,7 @@ > struct aspeed_lpc_ctrl { > struct miscdevice miscdev; > struct regmap *regmap; > + struct clk *clk; > phys_addr_t mem_base; > resource_size_t mem_size; > u32 pnor_size; > @@ -221,16 +223,33 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev) > return -ENODEV; > } > > + lpc_ctrl->clk = devm_clk_get(dev, NULL); > + if (IS_ERR(lpc_ctrl->clk)) { > + dev_err(dev, "couldn't get clock\n"); > + return PTR_ERR(lpc_ctrl->clk); > + } > + rc = clk_prepare_enable(lpc_ctrl->clk); > + if (rc) { > + dev_err(dev, "couldn't enable clock\n"); > + return rc; > + } > + > lpc_ctrl->miscdev.minor = MISC_DYNAMIC_MINOR; > lpc_ctrl->miscdev.name = DEVICE_NAME; > lpc_ctrl->miscdev.fops = &aspeed_lpc_ctrl_fops; > lpc_ctrl->miscdev.parent = dev; > rc = misc_register(&lpc_ctrl->miscdev); > - if (rc) > + if (rc) { > dev_err(dev, "Unable to register device\n"); > - else > - dev_info(dev, "Loaded at %pr\n", &resm); > + goto err; > + } > + > + dev_info(dev, "Loaded at %pr\n", &resm); > + > + return 0; > > +err: > + clk_disable_unprepare(lpc_ctrl->clk); > return rc; > } > > @@ -239,6 +258,7 @@ static int aspeed_lpc_ctrl_remove(struct platform_device *pdev) > struct aspeed_lpc_ctrl *lpc_ctrl = dev_get_drvdata(&pdev->dev); > > misc_deregister(&lpc_ctrl->miscdev); > + clk_disable_unprepare(lpc_ctrl->clk); > > return 0; > } -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html