diff for duplicates of <577CBB62.8080806@phytec.de> diff --git a/a/1.txt b/N1/1.txt index eb51e05..1069fd3 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -3,7 +3,7 @@ Hi Andy, On 06.07.2016 05:15, Andy Yan wrote: > Hi Wadim: > -> On 2016=E5=B9=B406=E6=9C=8809=E6=97=A5 16:23, Wadim Egorov wrote: +> On 2016年06月09日 16:23, Wadim Egorov wrote: >> Hi, >> >> On 08.06.2016 16:17, Lee Jones wrote: @@ -28,7 +28,7 @@ On 06.07.2016 05:15, Andy Yan wrote: >>>> So we can reuse the RTC and Clkout functionality. >>> Swap '.' for ','. >>> ->>>> Signed-off-by: Wadim Egorov <w.egorov@phytec.de> +>>>> Signed-off-by: Wadim Egorov <w.egorov-guT5V/WYfQezQB+pC5nmwQ@public.gmane.org> >>>> --- >>>> drivers/mfd/Kconfig | 4 +- >>>> drivers/mfd/rk808.c | 231 @@ -40,17 +40,17 @@ On 06.07.2016 05:15, Andy Yan wrote: >>>> index 1bcf601..7ba464b 100644 >>>> --- a/drivers/mfd/Kconfig >>>> +++ b/drivers/mfd/Kconfig ->>>> @@ -839,13 +839,13 @@ config MFD=5FRC5T583 +>>>> @@ -839,13 +839,13 @@ config MFD_RC5T583 >>>> different functionality of the device. ->>>> config MFD=5FRK808 +>>>> config MFD_RK808 >>>> - tristate "Rockchip RK808 Power Management chip" >>>> + tristate "Rockchip RK808/RK818 Power Management chip" >>> "Chip" >>> >>>> depends on I2C && OF ->>>> select MFD=5FCORE ->>>> select REGMAP=5FI2C ->>>> select REGMAP=5FIRQ +>>>> select MFD_CORE +>>>> select REGMAP_I2C +>>>> select REGMAP_IRQ >>>> help >>>> - If you say yes here you get support for the RK808 >>>> + If you say yes here you get support for the RK808 and RK818 @@ -69,12 +69,12 @@ On 06.07.2016 05:15, Andy Yan wrote: >>>> * >>>> * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd >>>> * ->>>> * Author: Chris Zhong <zyw@rock-chips.com> ->>>> * Author: Zhang Qing <zhangqing@rock-chips.com> +>>>> * Author: Chris Zhong <zyw-TNX95d0MmH7DzftRWevZcw@public.gmane.org> +>>>> * Author: Zhang Qing <zhangqing-TNX95d0MmH7DzftRWevZcw@public.gmane.org> >>>> * >>>> + * Copyright (C) 2016 PHYTEC Messtechnik GmbH >>>> + * ->>>> + * Author: Wadim Egorov <w.egorov@phytec.de> +>>>> + * Author: Wadim Egorov <w.egorov-guT5V/WYfQezQB+pC5nmwQ@public.gmane.org> >>>> + * >>>> * This program is free software; you can redistribute it and/or >>>> modify it @@ -85,7 +85,7 @@ On 06.07.2016 05:15, Andy Yan wrote: >>>> #include <linux/module.h> >>>> #include <linux/regmap.h> >>>> - ->>>> -struct rk808=5Freg=5Fdata { +>>>> -struct rk808_reg_data { >>>> - int addr; >>>> - int mask; >>>> - int value; @@ -93,196 +93,181 @@ On 06.07.2016 05:15, Andy Yan wrote: >>> Why are you moving this to the header? >> It is now part of the rk808 struct. >> ->>>> +#include <linux/of=5Fdevice.h> ->>>> static bool rk808=5Fis=5Fvolatile=5Freg(struct device *dev, unsign= -ed +>>>> +#include <linux/of_device.h> +>>>> static bool rk808_is_volatile_reg(struct device *dev, unsigned >>>> int reg) >>>> { ->>>> @@ -57,6 +56,14 @@ static bool rk808=5Fis=5Fvolatile=5Freg(struct devi= -ce +>>>> @@ -57,6 +56,14 @@ static bool rk808_is_volatile_reg(struct device >>>> *dev, unsigned int reg) >>>> return false; >>>> } ->>>> +static const struct regmap=5Fconfig rk818=5Fregmap=5Fconfig =3D { ->>>> + .reg=5Fbits =3D 8, ->>>> + .val=5Fbits =3D 8, ->>>> + .max=5Fregister =3D RK818=5FUSB=5FCTRL=5FREG, ->>>> + .cache=5Ftype =3D REGCACHE=5FRBTREE, ->>>> + .volatile=5Freg =3D rk808=5Fis=5Fvolatile=5Freg, +>>>> +static const struct regmap_config rk818_regmap_config = { +>>>> + .reg_bits = 8, +>>>> + .val_bits = 8, +>>>> + .max_register = RK818_USB_CTRL_REG, +>>>> + .cache_type = REGCACHE_RBTREE, +>>>> + .volatile_reg = rk808_is_volatile_reg, >>>> +}; >>>> + ->>>> static const struct regmap=5Fconfig rk808=5Fregmap=5Fconfig =3D { ->>>> .reg=5Fbits =3D 8, ->>>> .val=5Fbits =3D 8, ->>>> @@ -83,7 +90,17 @@ static const struct mfd=5Fcell rk808s[] =3D { +>>>> static const struct regmap_config rk808_regmap_config = { +>>>> .reg_bits = 8, +>>>> .val_bits = 8, +>>>> @@ -83,7 +90,17 @@ static const struct mfd_cell rk808s[] = { >>>> }, >>>> }; ->>>> -static const struct rk808=5Freg=5Fdata pre=5Finit=5Freg[] =3D { ->>>> +static const struct mfd=5Fcell rk818s[] =3D { ->>>> + { .name =3D "rk808-clkout", }, +>>>> -static const struct rk808_reg_data pre_init_reg[] = { +>>>> +static const struct mfd_cell rk818s[] = { +>>>> + { .name = "rk808-clkout", }, >>> How does this differ to a normal -clock driver? >> I don't know. It is a normal clock driver. >> ->>>> + { .name =3D "rk808-regulator", }, +>>>> + { .name = "rk808-regulator", }, >>>> + { ->>>> + .name =3D "rk808-rtc", ->>>> + .num=5Fresources =3D ARRAY=5FSIZE(rtc=5Fresources), ->>>> + .resources =3D &rtc=5Fresources[0], ->>> .resources =3D rtc=5Fresources, ? +>>>> + .name = "rk808-rtc", +>>>> + .num_resources = ARRAY_SIZE(rtc_resources), +>>>> + .resources = &rtc_resources[0], +>>> .resources = rtc_resources, ? >>> >>>> + }, >>>> +}; >>>> + ->>>> +static const struct rk8xx=5Freg=5Fdata rk808=5Fpre=5Finit=5Freg[] =3D= - { ->>>> { RK808=5FBUCK3=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FILM= -IN=5F150MA }, ->>>> { RK808=5FBUCK4=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FILM= -IN=5F200MA }, ->>>> { RK808=5FBOOST=5FCONFIG=5FREG, BOOST=5FILMIN=5FMASK, BOOST=5FIL= -MIN=5F100MA }, ->>>> @@ -94,6 +111,22 @@ static const struct rk808=5Freg=5Fdata ->>>> pre=5Finit=5Freg[] =3D { ->>>> VB=5FLO=5FSEL=5F3500MV }, +>>>> +static const struct rk8xx_reg_data rk808_pre_init_reg[] = { +>>>> { RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_150MA }, +>>>> { RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_200MA }, +>>>> { RK808_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA }, +>>>> @@ -94,6 +111,22 @@ static const struct rk808_reg_data +>>>> pre_init_reg[] = { +>>>> VB_LO_SEL_3500MV }, >>>> }; ->>>> +static const struct rk8xx=5Freg=5Fdata rk818=5Fpre=5Finit=5Freg[] = -=3D { ->>>> + { RK818=5FUSB=5FCTRL=5FREG, RK818=5FUSB=5FILIM=5FSEL=5FMASK, ->>>> + RK818=5FUSB=5FILMIN=5F2000MA }, +>>>> +static const struct rk8xx_reg_data rk818_pre_init_reg[] = { +>>>> + { RK818_USB_CTRL_REG, RK818_USB_ILIM_SEL_MASK, +>>>> + RK818_USB_ILMIN_2000MA }, >>>> + /* close charger when usb lower then 3.4V */ ->>>> + { RK818=5FUSB=5FCTRL=5FREG, RK818=5FUSB=5FCHG=5FSD=5FVSEL=5FMA= -SK, (0x7 << +>>>> + { RK818_USB_CTRL_REG, RK818_USB_CHG_SD_VSEL_MASK, (0x7 << >>>> 4) }, >>>> + /* no action when vref */ ->>>> + { RK818=5FH5V=5FEN=5FREG, BIT(1), RK818=5FREF=5FRDY=5FC= -TRL }, +>>>> + { RK818_H5V_EN_REG, BIT(1), RK818_REF_RDY_CTRL }, >>>> + /* enable HDMI 5V */ ->>>> + { RK818=5FH5V=5FEN=5FREG, BIT(0), RK818=5FH5V=5FEN }, +>>>> + { RK818_H5V_EN_REG, BIT(0), RK818_H5V_EN }, >>>> + /* improve efficiency */ ->>>> + { RK818=5FBUCK2=5FCONFIG=5FREG, BUCK2=5FRATE=5FMASK, BUCK=5FIL= -MIN=5F250MA }, ->>>> + { RK818=5FBUCK4=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FIL= -MIN=5F250MA }, ->>>> + { RK818=5FBOOST=5FCONFIG=5FREG, BOOST=5FILMIN=5FMASK, =20 ->>>> BOOST=5FILMIN=5F100MA }, ->>>> + { RK808=5FVB=5FMON=5FREG, MASK=5FALL, VB=5FLO=5FACT | ->>>> VB=5FLO=5FSEL=5F3500MV }, +>>>> + { RK818_BUCK2_CONFIG_REG, BUCK2_RATE_MASK, BUCK_ILMIN_250MA }, +>>>> + { RK818_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_250MA }, +>>>> + { RK818_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, +>>>> BOOST_ILMIN_100MA }, +>>>> + { RK808_VB_MON_REG, MASK_ALL, VB_LO_ACT | +>>>> VB_LO_SEL_3500MV }, >>>> +}; >>> The alignment here looks odd. >> I will fix it in the next version. >> ->>>> static const struct regmap=5Firq rk808=5Firqs[] =3D { ->>>> /* INT=5FSTS */ ->>>> [RK808=5FIRQ=5FVOUT=5FLO] =3D { ->>>> @@ -136,6 +169,76 @@ static const struct regmap=5Firq rk808=5Firqs[] = -=3D { +>>>> static const struct regmap_irq rk808_irqs[] = { +>>>> /* INT_STS */ +>>>> [RK808_IRQ_VOUT_LO] = { +>>>> @@ -136,6 +169,76 @@ static const struct regmap_irq rk808_irqs[] = { >>>> }, >>>> }; ->>>> +static const struct regmap=5Firq rk818=5Firqs[] =3D { ->>>> + /* INT=5FSTS */ ->>>> + [RK818=5FIRQ=5FVOUT=5FLO] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FVOUT=5FLO=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> +static const struct regmap_irq rk818_irqs[] = { +>>>> + /* INT_STS */ +>>>> + [RK818_IRQ_VOUT_LO] = { +>>>> + .mask = RK818_IRQ_VOUT_LO_MSK, +>>>> + .reg_offset = 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FVB=5FLO] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FVB=5FLO=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_VB_LO] = { +>>>> + .mask = RK818_IRQ_VB_LO_MSK, +>>>> + .reg_offset = 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FPWRON] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FPWRON=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_PWRON] = { +>>>> + .mask = RK818_IRQ_PWRON_MSK, +>>>> + .reg_offset = 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FPWRON=5FLP] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FPWRON=5FLP=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_PWRON_LP] = { +>>>> + .mask = RK818_IRQ_PWRON_LP_MSK, +>>>> + .reg_offset = 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FHOTDIE] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FHOTDIE=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_HOTDIE] = { +>>>> + .mask = RK818_IRQ_HOTDIE_MSK, +>>>> + .reg_offset = 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FRTC=5FALARM] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FRTC=5FALARM=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_RTC_ALARM] = { +>>>> + .mask = RK818_IRQ_RTC_ALARM_MSK, +>>>> + .reg_offset = 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FRTC=5FPERIOD] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FRTC=5FPERIOD=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_RTC_PERIOD] = { +>>>> + .mask = RK818_IRQ_RTC_PERIOD_MSK, +>>>> + .reg_offset = 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FUSB=5FOV] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FUSB=5FOV=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_USB_OV] = { +>>>> + .mask = RK818_IRQ_USB_OV_MSK, +>>>> + .reg_offset = 0, >>>> + }, >>>> + ->>>> + /* INT=5FSTS2 */ ->>>> + [RK818=5FIRQ=5FPLUG=5FIN] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FPLUG=5FIN=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + /* INT_STS2 */ +>>>> + [RK818_IRQ_PLUG_IN] = { +>>>> + .mask = RK818_IRQ_PLUG_IN_MSK, +>>>> + .reg_offset = 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FPLUG=5FOUT] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FPLUG=5FOUT=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_PLUG_OUT] = { +>>>> + .mask = RK818_IRQ_PLUG_OUT_MSK, +>>>> + .reg_offset = 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FCHG=5FOK] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FCHG=5FOK=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_CHG_OK] = { +>>>> + .mask = RK818_IRQ_CHG_OK_MSK, +>>>> + .reg_offset = 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FCHG=5FTE] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FCHG=5FTE=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_CHG_TE] = { +>>>> + .mask = RK818_IRQ_CHG_TE_MSK, +>>>> + .reg_offset = 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FCHG=5FTS1] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FCHG=5FTS1=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_CHG_TS1] = { +>>>> + .mask = RK818_IRQ_CHG_TS1_MSK, +>>>> + .reg_offset = 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FTS2] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FTS2=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_TS2] = { +>>>> + .mask = RK818_IRQ_TS2_MSK, +>>>> + .reg_offset = 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FCHG=5FCVTLIM] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FCHG=5FCVTLIM=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_CHG_CVTLIM] = { +>>>> + .mask = RK818_IRQ_CHG_CVTLIM_MSK, +>>>> + .reg_offset = 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FDISCHG=5FILIM] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FDISCHG=5FILIM=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_DISCHG_ILIM] = { +>>>> + .mask = RK818_IRQ_DISCHG_ILIM_MSK, +>>>> + .reg_offset = 1, >>>> + }, >>>> +}; >>>> + ->>>> static struct regmap=5Firq=5Fchip rk808=5Firq=5Fchip =3D { ->>>> .name =3D "rk808", ->>>> .irqs =3D rk808=5Firqs, ->>>> @@ -148,6 +251,18 @@ static struct regmap=5Firq=5Fchip rk808=5Firq=5Fc= -hip =3D { ->>>> .init=5Fack=5Fmasked =3D true, +>>>> static struct regmap_irq_chip rk808_irq_chip = { +>>>> .name = "rk808", +>>>> .irqs = rk808_irqs, +>>>> @@ -148,6 +251,18 @@ static struct regmap_irq_chip rk808_irq_chip = { +>>>> .init_ack_masked = true, >>>> }; ->>>> +static struct regmap=5Firq=5Fchip rk818=5Firq=5Fchip =3D { ->>>> + .name =3D "rk818", ->>>> + .irqs =3D rk818=5Firqs, ->>>> + .num=5Firqs =3D ARRAY=5FSIZE(rk818=5Firqs), ->>>> + .num=5Fregs =3D 2, ->>>> + .irq=5Freg=5Fstride =3D 2, ->>>> + .status=5Fbase =3D RK818=5FINT=5FSTS=5FREG1, ->>>> + .mask=5Fbase =3D RK818=5FINT=5FSTS=5FMSK=5FREG1, ->>>> + .ack=5Fbase =3D RK818=5FINT=5FSTS=5FREG1, ->>>> + .init=5Fack=5Fmasked =3D true, +>>>> +static struct regmap_irq_chip rk818_irq_chip = { +>>>> + .name = "rk818", +>>>> + .irqs = rk818_irqs, +>>>> + .num_irqs = ARRAY_SIZE(rk818_irqs), +>>>> + .num_regs = 2, +>>>> + .irq_reg_stride = 2, +>>>> + .status_base = RK818_INT_STS_REG1, +>>>> + .mask_base = RK818_INT_STS_MSK_REG1, +>>>> + .ack_base = RK818_INT_STS_REG1, +>>>> + .init_ack_masked = true, >>>> +}; >>>> + ->>>> static struct i2c=5Fclient *rk808=5Fi2c=5Fclient; ->>>> static void rk808=5Fdevice=5Fshutdown(void) +>>>> static struct i2c_client *rk808_i2c_client; +>>>> static void rk808_device_shutdown(void) >>>> { ->>>> @@ -167,6 +282,48 @@ static void rk808=5Fdevice=5Fshutdown(void) ->>>> dev=5Ferr(&rk808=5Fi2c=5Fclient->dev, "power off error!\n"); +>>>> @@ -167,6 +282,48 @@ static void rk808_device_shutdown(void) +>>>> dev_err(&rk808_i2c_client->dev, "power off error!\n"); >>>> } ->>>> +static const struct of=5Fdevice=5Fid rk808=5Fof=5Fmatch[] =3D { ->>>> + { .compatible =3D "rockchip,rk808", .data =3D (void *) RK808=5FID= - }, ->>>> + { .compatible =3D "rockchip,rk818", .data =3D (void *) RK818=5FID= - }, +>>>> +static const struct of_device_id rk808_of_match[] = { +>>>> + { .compatible = "rockchip,rk808", .data = (void *) RK808_ID }, +>>>> + { .compatible = "rockchip,rk818", .data = (void *) RK818_ID }, >>>> + { }, >>>> +}; ->>>> +MODULE=5FDEVICE=5FTABLE(of, rk808=5Fof=5Fmatch); +>>>> +MODULE_DEVICE_TABLE(of, rk808_of_match); >>>> + ->>>> +static int rk8xx=5Fmatch=5Fdevice(struct rk808 *rk808, struct device +>>>> +static int rk8xx_match_device(struct rk808 *rk808, struct device >>>> *dev) >>> If you're going to do it this way, please switch these parameters. >>> @@ -290,61 +275,57 @@ hip =3D { >> If it's more common I will return a pointer to rk808. >> >>>> +{ ->>>> + const struct of=5Fdevice=5Fid *of=5Fid; +>>>> + const struct of_device_id *of_id; >>>> + ->>>> + of=5Fid =3D of=5Fmatch=5Fdevice(rk808=5Fof=5Fmatch, dev); ->>>> + if (!of=5Fid) { ->>>> + dev=5Ferr(dev, "Unable to match OF ID\n"); +>>>> + of_id = of_match_device(rk808_of_match, dev); +>>>> + if (!of_id) { +>>>> + dev_err(dev, "Unable to match OF ID\n"); >>>> + return -ENODEV; >>>> + } ->>>> + rk808->variant =3D (long) of=5Fid->data; +>>>> + rk808->variant = (long) of_id->data; >>>> + >>>> + switch (rk808->variant) { ->>>> + case RK808=5FID: ->>>> + rk808->nr=5Fcells =3D ARRAY=5FSIZE(rk808s); ->>>> + rk808->cells =3D rk808s; ->>>> + rk808->regmap=5Fcfg =3D &rk808=5Fregmap=5Fconfig; ->>>> + rk808->regmap=5Firq=5Fchip =3D &rk808=5Firq=5Fchip; ->>>> + rk808->pre=5Finit=5Freg =3D rk808=5Fpre=5Finit=5Freg; ->>>> + rk808->nr=5Fpre=5Finit=5Fregs =3D ARRAY=5FSIZE(rk808=5Fpre=5F= -init=5Freg); +>>>> + case RK808_ID: +>>>> + rk808->nr_cells = ARRAY_SIZE(rk808s); +>>>> + rk808->cells = rk808s; +>>>> + rk808->regmap_cfg = &rk808_regmap_config; +>>>> + rk808->regmap_irq_chip = &rk808_irq_chip; +>>>> + rk808->pre_init_reg = rk808_pre_init_reg; +>>>> + rk808->nr_pre_init_regs = ARRAY_SIZE(rk808_pre_init_reg); >>>> + break; ->>>> + case RK818=5FID: ->>>> + rk808->nr=5Fcells =3D ARRAY=5FSIZE(rk818s); ->>>> + rk808->cells =3D rk818s; ->>>> + rk808->regmap=5Fcfg =3D &rk818=5Fregmap=5Fconfig; ->>>> + rk808->regmap=5Firq=5Fchip =3D &rk818=5Firq=5Fchip; ->>>> + rk808->pre=5Finit=5Freg =3D rk818=5Fpre=5Finit=5Freg; ->>>> + rk808->nr=5Fpre=5Finit=5Fregs =3D ARRAY=5FSIZE(rk818=5Fpre=5F= -init=5Freg); +>>>> + case RK818_ID: +>>>> + rk808->nr_cells = ARRAY_SIZE(rk818s); +>>>> + rk808->cells = rk818s; +>>>> + rk808->regmap_cfg = &rk818_regmap_config; +>>>> + rk808->regmap_irq_chip = &rk818_irq_chip; +>>>> + rk808->pre_init_reg = rk818_pre_init_reg; +>>>> + rk808->nr_pre_init_regs = ARRAY_SIZE(rk818_pre_init_reg); >>>> + break; >>>> + default: ->>>> + dev=5Ferr(dev, "unsupported RK8XX ID %lu\n", rk808->variant); +>>>> + dev_err(dev, "unsupported RK8XX ID %lu\n", rk808->variant); >>>> + return -EINVAL; >>>> + } >>>> + >>>> + return 0; >>>> +} ->>>> static int rk808=5Fprobe(struct i2c=5Fclient *client, ->>>> const struct i2c=5Fdevice=5Fid *id) +>>>> static int rk808_probe(struct i2c_client *client, +>>>> const struct i2c_device_id *id) >>>> { ->>>> @@ -176,46 +333,52 @@ static int rk808=5Fprobe(struct i2c=5Fclient +>>>> @@ -176,46 +333,52 @@ static int rk808_probe(struct i2c_client >>>> *client, >>>> int ret; >>>> int i; >>>> - if (!client->irq) { ->>>> - dev=5Ferr(&client->dev, "No interrupt support, no core IRQ\n"= -); +>>>> - dev_err(&client->dev, "No interrupt support, no core IRQ\n"); >>>> - return -EINVAL; >>>> - } >>>> - ->>>> rk808 =3D devm=5Fkzalloc(&client->dev, sizeof(*rk808), GFP=5FKER= -NEL); +>>>> rk808 = devm_kzalloc(&client->dev, sizeof(*rk808), GFP_KERNEL); >>>> if (!rk808) >>>> return -ENOMEM; ->>>> - rk808->regmap =3D devm=5Fregmap=5Finit=5Fi2c(client, ->>>> &rk808=5Fregmap=5Fconfig); ->>>> + ret =3D rk8xx=5Fmatch=5Fdevice(rk808, &client->dev); +>>>> - rk808->regmap = devm_regmap_init_i2c(client, +>>>> &rk808_regmap_config); +>>>> + ret = rk8xx_match_device(rk808, &client->dev); >>> Is there a way to dynamically probe the device? No device ID you can >>> read directly from the silicon? >> AFAIK there is no device ID register. At least it is not documented in @@ -362,3 +343,13 @@ in your kernel tree. I would like to read the device ID from the register in the probe function. Do you want me to base my changes on top of this series or send a new version? + +-- +You received this message because you are subscribed to "rtc-linux". +Membership options at http://groups.google.com/group/rtc-linux . +Please read http://groups.google.com/group/rtc-linux/web/checklist +before submitting a driver. +--- +You received this message because you are subscribed to the Google Groups "rtc-linux" group. +To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org +For more options, visit https://groups.google.com/d/optout. diff --git a/a/content_digest b/N1/content_digest index 568572d..90cc65b 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -2,29 +2,30 @@ "ref\020160608141735.GE14888@dell\0" "ref\05759277D.7090101@phytec.de\0" "ref\0577C77DF.9060706@rock-chips.com\0" - "From\0Wadim Egorov <w.egorov@phytec.de>\0" + "ref\0577C77DF.9060706-TNX95d0MmH7DzftRWevZcw@public.gmane.org\0" + "From\0Wadim Egorov <w.egorov-guT5V/WYfQezQB+pC5nmwQ@public.gmane.org>\0" "Subject\0Re: [RESEND PATCH v5 1/5] mfd: RK808: Add RK818 support\0" "Date\0Wed, 6 Jul 2016 10:03:46 +0200\0" - "To\0Andy Yan <andy.yan@rock-chips.com>" - " Lee Jones <lee.jones@linaro.org>\0" - "Cc\0mark.rutland@arm.com" - devicetree@vger.kernel.org - a.zummo@towertech.it - pawel.moll@arm.com - rtc-linux@googlegroups.com - ijc+devicetree@hellion.org.uk - mturquette@baylibre.com - sboyd@codeaurora.org - linux-kernel@vger.kernel.org - lgirdwood@gmail.com - linux-rockchip@lists.infradead.org - robh+dt@kernel.org - alexandre.belloni@free-electrons.com - broonie@kernel.org - dianders@chromium.org - galak@codeaurora.org - zyw@rock-chips.com - " linux-clk@vger.kernel.org\0" + "To\0Andy Yan <andy.yan-TNX95d0MmH7DzftRWevZcw@public.gmane.org>" + " Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>\0" + "Cc\0mark.rutland-5wv7dgnIgG8@public.gmane.org" + devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org + a.zummo-BfzFCNDTiLLj+vYz1yj4TQ@public.gmane.org + pawel.moll-5wv7dgnIgG8@public.gmane.org + rtc-linux-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org + ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg@public.gmane.org + mturquette-rdvid1DuHRBWk0Htik3J/w@public.gmane.org + sboyd-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org + linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org + lgirdwood-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org + linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org + robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org + alexandre.belloni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org + broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org + dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org + galak-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org + zyw-TNX95d0MmH7DzftRWevZcw@public.gmane.org + " linux-clk-u79uwXL29TY76Z2rM5mHXA@public.gmane.org\0" "\00:1\0" "b\0" "Hi Andy,\n" @@ -32,7 +33,7 @@ "On 06.07.2016 05:15, Andy Yan wrote:\n" "> Hi Wadim:\n" ">\n" - "> On 2016=E5=B9=B406=E6=9C=8809=E6=97=A5 16:23, Wadim Egorov wrote:\n" + "> On 2016\345\271\26406\346\234\21009\346\227\245 16:23, Wadim Egorov wrote:\n" ">> Hi,\n" ">>\n" ">> On 08.06.2016 16:17, Lee Jones wrote:\n" @@ -57,7 +58,7 @@ ">>>> So we can reuse the RTC and Clkout functionality.\n" ">>> Swap '.' for ','.\n" ">>>\n" - ">>>> Signed-off-by: Wadim Egorov <w.egorov@phytec.de>\n" + ">>>> Signed-off-by: Wadim Egorov <w.egorov-guT5V/WYfQezQB+pC5nmwQ@public.gmane.org>\n" ">>>> ---\n" ">>>> drivers/mfd/Kconfig | 4 +-\n" ">>>> drivers/mfd/rk808.c | 231\n" @@ -69,17 +70,17 @@ ">>>> index 1bcf601..7ba464b 100644\n" ">>>> --- a/drivers/mfd/Kconfig\n" ">>>> +++ b/drivers/mfd/Kconfig\n" - ">>>> @@ -839,13 +839,13 @@ config MFD=5FRC5T583\n" + ">>>> @@ -839,13 +839,13 @@ config MFD_RC5T583\n" ">>>> different functionality of the device.\n" - ">>>> config MFD=5FRK808\n" + ">>>> config MFD_RK808\n" ">>>> - tristate \"Rockchip RK808 Power Management chip\"\n" ">>>> + tristate \"Rockchip RK808/RK818 Power Management chip\"\n" ">>> \"Chip\"\n" ">>>\n" ">>>> depends on I2C && OF\n" - ">>>> select MFD=5FCORE\n" - ">>>> select REGMAP=5FI2C\n" - ">>>> select REGMAP=5FIRQ\n" + ">>>> select MFD_CORE\n" + ">>>> select REGMAP_I2C\n" + ">>>> select REGMAP_IRQ\n" ">>>> help\n" ">>>> - If you say yes here you get support for the RK808\n" ">>>> + If you say yes here you get support for the RK808 and RK818\n" @@ -98,12 +99,12 @@ ">>>> *\n" ">>>> * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd\n" ">>>> *\n" - ">>>> * Author: Chris Zhong <zyw@rock-chips.com>\n" - ">>>> * Author: Zhang Qing <zhangqing@rock-chips.com>\n" + ">>>> * Author: Chris Zhong <zyw-TNX95d0MmH7DzftRWevZcw@public.gmane.org>\n" + ">>>> * Author: Zhang Qing <zhangqing-TNX95d0MmH7DzftRWevZcw@public.gmane.org>\n" ">>>> *\n" ">>>> + * Copyright (C) 2016 PHYTEC Messtechnik GmbH\n" ">>>> + *\n" - ">>>> + * Author: Wadim Egorov <w.egorov@phytec.de>\n" + ">>>> + * Author: Wadim Egorov <w.egorov-guT5V/WYfQezQB+pC5nmwQ@public.gmane.org>\n" ">>>> + *\n" ">>>> * This program is free software; you can redistribute it and/or\n" ">>>> modify it\n" @@ -114,7 +115,7 @@ ">>>> #include <linux/module.h>\n" ">>>> #include <linux/regmap.h>\n" ">>>> -\n" - ">>>> -struct rk808=5Freg=5Fdata {\n" + ">>>> -struct rk808_reg_data {\n" ">>>> - int addr;\n" ">>>> - int mask;\n" ">>>> - int value;\n" @@ -122,196 +123,181 @@ ">>> Why are you moving this to the header?\n" ">> It is now part of the rk808 struct.\n" ">>\n" - ">>>> +#include <linux/of=5Fdevice.h>\n" - ">>>> static bool rk808=5Fis=5Fvolatile=5Freg(struct device *dev, unsign=\n" - "ed\n" + ">>>> +#include <linux/of_device.h>\n" + ">>>> static bool rk808_is_volatile_reg(struct device *dev, unsigned\n" ">>>> int reg)\n" ">>>> {\n" - ">>>> @@ -57,6 +56,14 @@ static bool rk808=5Fis=5Fvolatile=5Freg(struct devi=\n" - "ce\n" + ">>>> @@ -57,6 +56,14 @@ static bool rk808_is_volatile_reg(struct device\n" ">>>> *dev, unsigned int reg)\n" ">>>> return false;\n" ">>>> }\n" - ">>>> +static const struct regmap=5Fconfig rk818=5Fregmap=5Fconfig =3D {\n" - ">>>> + .reg=5Fbits =3D 8,\n" - ">>>> + .val=5Fbits =3D 8,\n" - ">>>> + .max=5Fregister =3D RK818=5FUSB=5FCTRL=5FREG,\n" - ">>>> + .cache=5Ftype =3D REGCACHE=5FRBTREE,\n" - ">>>> + .volatile=5Freg =3D rk808=5Fis=5Fvolatile=5Freg,\n" + ">>>> +static const struct regmap_config rk818_regmap_config = {\n" + ">>>> + .reg_bits = 8,\n" + ">>>> + .val_bits = 8,\n" + ">>>> + .max_register = RK818_USB_CTRL_REG,\n" + ">>>> + .cache_type = REGCACHE_RBTREE,\n" + ">>>> + .volatile_reg = rk808_is_volatile_reg,\n" ">>>> +};\n" ">>>> +\n" - ">>>> static const struct regmap=5Fconfig rk808=5Fregmap=5Fconfig =3D {\n" - ">>>> .reg=5Fbits =3D 8,\n" - ">>>> .val=5Fbits =3D 8,\n" - ">>>> @@ -83,7 +90,17 @@ static const struct mfd=5Fcell rk808s[] =3D {\n" + ">>>> static const struct regmap_config rk808_regmap_config = {\n" + ">>>> .reg_bits = 8,\n" + ">>>> .val_bits = 8,\n" + ">>>> @@ -83,7 +90,17 @@ static const struct mfd_cell rk808s[] = {\n" ">>>> },\n" ">>>> };\n" - ">>>> -static const struct rk808=5Freg=5Fdata pre=5Finit=5Freg[] =3D {\n" - ">>>> +static const struct mfd=5Fcell rk818s[] =3D {\n" - ">>>> + { .name =3D \"rk808-clkout\", },\n" + ">>>> -static const struct rk808_reg_data pre_init_reg[] = {\n" + ">>>> +static const struct mfd_cell rk818s[] = {\n" + ">>>> + { .name = \"rk808-clkout\", },\n" ">>> How does this differ to a normal -clock driver?\n" ">> I don't know. It is a normal clock driver.\n" ">>\n" - ">>>> + { .name =3D \"rk808-regulator\", },\n" + ">>>> + { .name = \"rk808-regulator\", },\n" ">>>> + {\n" - ">>>> + .name =3D \"rk808-rtc\",\n" - ">>>> + .num=5Fresources =3D ARRAY=5FSIZE(rtc=5Fresources),\n" - ">>>> + .resources =3D &rtc=5Fresources[0],\n" - ">>> .resources =3D rtc=5Fresources, ?\n" + ">>>> + .name = \"rk808-rtc\",\n" + ">>>> + .num_resources = ARRAY_SIZE(rtc_resources),\n" + ">>>> + .resources = &rtc_resources[0],\n" + ">>> .resources = rtc_resources, ?\n" ">>>\n" ">>>> + },\n" ">>>> +};\n" ">>>> +\n" - ">>>> +static const struct rk8xx=5Freg=5Fdata rk808=5Fpre=5Finit=5Freg[] =3D=\n" - " {\n" - ">>>> { RK808=5FBUCK3=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FILM=\n" - "IN=5F150MA },\n" - ">>>> { RK808=5FBUCK4=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FILM=\n" - "IN=5F200MA },\n" - ">>>> { RK808=5FBOOST=5FCONFIG=5FREG, BOOST=5FILMIN=5FMASK, BOOST=5FIL=\n" - "MIN=5F100MA },\n" - ">>>> @@ -94,6 +111,22 @@ static const struct rk808=5Freg=5Fdata\n" - ">>>> pre=5Finit=5Freg[] =3D {\n" - ">>>> VB=5FLO=5FSEL=5F3500MV },\n" + ">>>> +static const struct rk8xx_reg_data rk808_pre_init_reg[] = {\n" + ">>>> { RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_150MA },\n" + ">>>> { RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_200MA },\n" + ">>>> { RK808_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },\n" + ">>>> @@ -94,6 +111,22 @@ static const struct rk808_reg_data\n" + ">>>> pre_init_reg[] = {\n" + ">>>> VB_LO_SEL_3500MV },\n" ">>>> };\n" - ">>>> +static const struct rk8xx=5Freg=5Fdata rk818=5Fpre=5Finit=5Freg[] =\n" - "=3D {\n" - ">>>> + { RK818=5FUSB=5FCTRL=5FREG, RK818=5FUSB=5FILIM=5FSEL=5FMASK,\n" - ">>>> + RK818=5FUSB=5FILMIN=5F2000MA },\n" + ">>>> +static const struct rk8xx_reg_data rk818_pre_init_reg[] = {\n" + ">>>> + { RK818_USB_CTRL_REG, RK818_USB_ILIM_SEL_MASK,\n" + ">>>> + RK818_USB_ILMIN_2000MA },\n" ">>>> + /* close charger when usb lower then 3.4V */\n" - ">>>> + { RK818=5FUSB=5FCTRL=5FREG, RK818=5FUSB=5FCHG=5FSD=5FVSEL=5FMA=\n" - "SK, (0x7 <<\n" + ">>>> + { RK818_USB_CTRL_REG, RK818_USB_CHG_SD_VSEL_MASK, (0x7 <<\n" ">>>> 4) },\n" ">>>> + /* no action when vref */\n" - ">>>> + { RK818=5FH5V=5FEN=5FREG, BIT(1), RK818=5FREF=5FRDY=5FC=\n" - "TRL },\n" + ">>>> + { RK818_H5V_EN_REG, BIT(1), RK818_REF_RDY_CTRL },\n" ">>>> + /* enable HDMI 5V */\n" - ">>>> + { RK818=5FH5V=5FEN=5FREG, BIT(0), RK818=5FH5V=5FEN },\n" + ">>>> + { RK818_H5V_EN_REG, BIT(0), RK818_H5V_EN },\n" ">>>> + /* improve efficiency */\n" - ">>>> + { RK818=5FBUCK2=5FCONFIG=5FREG, BUCK2=5FRATE=5FMASK, BUCK=5FIL=\n" - "MIN=5F250MA },\n" - ">>>> + { RK818=5FBUCK4=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FIL=\n" - "MIN=5F250MA },\n" - ">>>> + { RK818=5FBOOST=5FCONFIG=5FREG, BOOST=5FILMIN=5FMASK, =20\n" - ">>>> BOOST=5FILMIN=5F100MA },\n" - ">>>> + { RK808=5FVB=5FMON=5FREG, MASK=5FALL, VB=5FLO=5FACT |\n" - ">>>> VB=5FLO=5FSEL=5F3500MV },\n" + ">>>> + { RK818_BUCK2_CONFIG_REG, BUCK2_RATE_MASK, BUCK_ILMIN_250MA },\n" + ">>>> + { RK818_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_250MA },\n" + ">>>> + { RK818_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, \n" + ">>>> BOOST_ILMIN_100MA },\n" + ">>>> + { RK808_VB_MON_REG, MASK_ALL, VB_LO_ACT |\n" + ">>>> VB_LO_SEL_3500MV },\n" ">>>> +};\n" ">>> The alignment here looks odd.\n" ">> I will fix it in the next version.\n" ">>\n" - ">>>> static const struct regmap=5Firq rk808=5Firqs[] =3D {\n" - ">>>> /* INT=5FSTS */\n" - ">>>> [RK808=5FIRQ=5FVOUT=5FLO] =3D {\n" - ">>>> @@ -136,6 +169,76 @@ static const struct regmap=5Firq rk808=5Firqs[] =\n" - "=3D {\n" + ">>>> static const struct regmap_irq rk808_irqs[] = {\n" + ">>>> /* INT_STS */\n" + ">>>> [RK808_IRQ_VOUT_LO] = {\n" + ">>>> @@ -136,6 +169,76 @@ static const struct regmap_irq rk808_irqs[] = {\n" ">>>> },\n" ">>>> };\n" - ">>>> +static const struct regmap=5Firq rk818=5Firqs[] =3D {\n" - ">>>> + /* INT=5FSTS */\n" - ">>>> + [RK818=5FIRQ=5FVOUT=5FLO] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FVOUT=5FLO=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> +static const struct regmap_irq rk818_irqs[] = {\n" + ">>>> + /* INT_STS */\n" + ">>>> + [RK818_IRQ_VOUT_LO] = {\n" + ">>>> + .mask = RK818_IRQ_VOUT_LO_MSK,\n" + ">>>> + .reg_offset = 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FVB=5FLO] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FVB=5FLO=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_VB_LO] = {\n" + ">>>> + .mask = RK818_IRQ_VB_LO_MSK,\n" + ">>>> + .reg_offset = 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FPWRON] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FPWRON=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_PWRON] = {\n" + ">>>> + .mask = RK818_IRQ_PWRON_MSK,\n" + ">>>> + .reg_offset = 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FPWRON=5FLP] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FPWRON=5FLP=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_PWRON_LP] = {\n" + ">>>> + .mask = RK818_IRQ_PWRON_LP_MSK,\n" + ">>>> + .reg_offset = 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FHOTDIE] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FHOTDIE=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_HOTDIE] = {\n" + ">>>> + .mask = RK818_IRQ_HOTDIE_MSK,\n" + ">>>> + .reg_offset = 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FRTC=5FALARM] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FRTC=5FALARM=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_RTC_ALARM] = {\n" + ">>>> + .mask = RK818_IRQ_RTC_ALARM_MSK,\n" + ">>>> + .reg_offset = 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FRTC=5FPERIOD] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FRTC=5FPERIOD=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_RTC_PERIOD] = {\n" + ">>>> + .mask = RK818_IRQ_RTC_PERIOD_MSK,\n" + ">>>> + .reg_offset = 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FUSB=5FOV] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FUSB=5FOV=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_USB_OV] = {\n" + ">>>> + .mask = RK818_IRQ_USB_OV_MSK,\n" + ">>>> + .reg_offset = 0,\n" ">>>> + },\n" ">>>> +\n" - ">>>> + /* INT=5FSTS2 */\n" - ">>>> + [RK818=5FIRQ=5FPLUG=5FIN] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FPLUG=5FIN=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + /* INT_STS2 */\n" + ">>>> + [RK818_IRQ_PLUG_IN] = {\n" + ">>>> + .mask = RK818_IRQ_PLUG_IN_MSK,\n" + ">>>> + .reg_offset = 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FPLUG=5FOUT] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FPLUG=5FOUT=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_PLUG_OUT] = {\n" + ">>>> + .mask = RK818_IRQ_PLUG_OUT_MSK,\n" + ">>>> + .reg_offset = 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FCHG=5FOK] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FCHG=5FOK=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_CHG_OK] = {\n" + ">>>> + .mask = RK818_IRQ_CHG_OK_MSK,\n" + ">>>> + .reg_offset = 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FCHG=5FTE] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FCHG=5FTE=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_CHG_TE] = {\n" + ">>>> + .mask = RK818_IRQ_CHG_TE_MSK,\n" + ">>>> + .reg_offset = 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FCHG=5FTS1] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FCHG=5FTS1=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_CHG_TS1] = {\n" + ">>>> + .mask = RK818_IRQ_CHG_TS1_MSK,\n" + ">>>> + .reg_offset = 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FTS2] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FTS2=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_TS2] = {\n" + ">>>> + .mask = RK818_IRQ_TS2_MSK,\n" + ">>>> + .reg_offset = 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FCHG=5FCVTLIM] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FCHG=5FCVTLIM=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_CHG_CVTLIM] = {\n" + ">>>> + .mask = RK818_IRQ_CHG_CVTLIM_MSK,\n" + ">>>> + .reg_offset = 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FDISCHG=5FILIM] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FDISCHG=5FILIM=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_DISCHG_ILIM] = {\n" + ">>>> + .mask = RK818_IRQ_DISCHG_ILIM_MSK,\n" + ">>>> + .reg_offset = 1,\n" ">>>> + },\n" ">>>> +};\n" ">>>> +\n" - ">>>> static struct regmap=5Firq=5Fchip rk808=5Firq=5Fchip =3D {\n" - ">>>> .name =3D \"rk808\",\n" - ">>>> .irqs =3D rk808=5Firqs,\n" - ">>>> @@ -148,6 +251,18 @@ static struct regmap=5Firq=5Fchip rk808=5Firq=5Fc=\n" - "hip =3D {\n" - ">>>> .init=5Fack=5Fmasked =3D true,\n" + ">>>> static struct regmap_irq_chip rk808_irq_chip = {\n" + ">>>> .name = \"rk808\",\n" + ">>>> .irqs = rk808_irqs,\n" + ">>>> @@ -148,6 +251,18 @@ static struct regmap_irq_chip rk808_irq_chip = {\n" + ">>>> .init_ack_masked = true,\n" ">>>> };\n" - ">>>> +static struct regmap=5Firq=5Fchip rk818=5Firq=5Fchip =3D {\n" - ">>>> + .name =3D \"rk818\",\n" - ">>>> + .irqs =3D rk818=5Firqs,\n" - ">>>> + .num=5Firqs =3D ARRAY=5FSIZE(rk818=5Firqs),\n" - ">>>> + .num=5Fregs =3D 2,\n" - ">>>> + .irq=5Freg=5Fstride =3D 2,\n" - ">>>> + .status=5Fbase =3D RK818=5FINT=5FSTS=5FREG1,\n" - ">>>> + .mask=5Fbase =3D RK818=5FINT=5FSTS=5FMSK=5FREG1,\n" - ">>>> + .ack=5Fbase =3D RK818=5FINT=5FSTS=5FREG1,\n" - ">>>> + .init=5Fack=5Fmasked =3D true,\n" + ">>>> +static struct regmap_irq_chip rk818_irq_chip = {\n" + ">>>> + .name = \"rk818\",\n" + ">>>> + .irqs = rk818_irqs,\n" + ">>>> + .num_irqs = ARRAY_SIZE(rk818_irqs),\n" + ">>>> + .num_regs = 2,\n" + ">>>> + .irq_reg_stride = 2,\n" + ">>>> + .status_base = RK818_INT_STS_REG1,\n" + ">>>> + .mask_base = RK818_INT_STS_MSK_REG1,\n" + ">>>> + .ack_base = RK818_INT_STS_REG1,\n" + ">>>> + .init_ack_masked = true,\n" ">>>> +};\n" ">>>> +\n" - ">>>> static struct i2c=5Fclient *rk808=5Fi2c=5Fclient;\n" - ">>>> static void rk808=5Fdevice=5Fshutdown(void)\n" + ">>>> static struct i2c_client *rk808_i2c_client;\n" + ">>>> static void rk808_device_shutdown(void)\n" ">>>> {\n" - ">>>> @@ -167,6 +282,48 @@ static void rk808=5Fdevice=5Fshutdown(void)\n" - ">>>> dev=5Ferr(&rk808=5Fi2c=5Fclient->dev, \"power off error!\\n\");\n" + ">>>> @@ -167,6 +282,48 @@ static void rk808_device_shutdown(void)\n" + ">>>> dev_err(&rk808_i2c_client->dev, \"power off error!\\n\");\n" ">>>> }\n" - ">>>> +static const struct of=5Fdevice=5Fid rk808=5Fof=5Fmatch[] =3D {\n" - ">>>> + { .compatible =3D \"rockchip,rk808\", .data =3D (void *) RK808=5FID=\n" - " },\n" - ">>>> + { .compatible =3D \"rockchip,rk818\", .data =3D (void *) RK818=5FID=\n" - " },\n" + ">>>> +static const struct of_device_id rk808_of_match[] = {\n" + ">>>> + { .compatible = \"rockchip,rk808\", .data = (void *) RK808_ID },\n" + ">>>> + { .compatible = \"rockchip,rk818\", .data = (void *) RK818_ID },\n" ">>>> + { },\n" ">>>> +};\n" - ">>>> +MODULE=5FDEVICE=5FTABLE(of, rk808=5Fof=5Fmatch);\n" + ">>>> +MODULE_DEVICE_TABLE(of, rk808_of_match);\n" ">>>> +\n" - ">>>> +static int rk8xx=5Fmatch=5Fdevice(struct rk808 *rk808, struct device\n" + ">>>> +static int rk8xx_match_device(struct rk808 *rk808, struct device\n" ">>>> *dev)\n" ">>> If you're going to do it this way, please switch these parameters.\n" ">>>\n" @@ -319,61 +305,57 @@ ">> If it's more common I will return a pointer to rk808.\n" ">>\n" ">>>> +{\n" - ">>>> + const struct of=5Fdevice=5Fid *of=5Fid;\n" + ">>>> + const struct of_device_id *of_id;\n" ">>>> +\n" - ">>>> + of=5Fid =3D of=5Fmatch=5Fdevice(rk808=5Fof=5Fmatch, dev);\n" - ">>>> + if (!of=5Fid) {\n" - ">>>> + dev=5Ferr(dev, \"Unable to match OF ID\\n\");\n" + ">>>> + of_id = of_match_device(rk808_of_match, dev);\n" + ">>>> + if (!of_id) {\n" + ">>>> + dev_err(dev, \"Unable to match OF ID\\n\");\n" ">>>> + return -ENODEV;\n" ">>>> + }\n" - ">>>> + rk808->variant =3D (long) of=5Fid->data;\n" + ">>>> + rk808->variant = (long) of_id->data;\n" ">>>> +\n" ">>>> + switch (rk808->variant) {\n" - ">>>> + case RK808=5FID:\n" - ">>>> + rk808->nr=5Fcells =3D ARRAY=5FSIZE(rk808s);\n" - ">>>> + rk808->cells =3D rk808s;\n" - ">>>> + rk808->regmap=5Fcfg =3D &rk808=5Fregmap=5Fconfig;\n" - ">>>> + rk808->regmap=5Firq=5Fchip =3D &rk808=5Firq=5Fchip;\n" - ">>>> + rk808->pre=5Finit=5Freg =3D rk808=5Fpre=5Finit=5Freg;\n" - ">>>> + rk808->nr=5Fpre=5Finit=5Fregs =3D ARRAY=5FSIZE(rk808=5Fpre=5F=\n" - "init=5Freg);\n" + ">>>> + case RK808_ID:\n" + ">>>> + rk808->nr_cells = ARRAY_SIZE(rk808s);\n" + ">>>> + rk808->cells = rk808s;\n" + ">>>> + rk808->regmap_cfg = &rk808_regmap_config;\n" + ">>>> + rk808->regmap_irq_chip = &rk808_irq_chip;\n" + ">>>> + rk808->pre_init_reg = rk808_pre_init_reg;\n" + ">>>> + rk808->nr_pre_init_regs = ARRAY_SIZE(rk808_pre_init_reg);\n" ">>>> + break;\n" - ">>>> + case RK818=5FID:\n" - ">>>> + rk808->nr=5Fcells =3D ARRAY=5FSIZE(rk818s);\n" - ">>>> + rk808->cells =3D rk818s;\n" - ">>>> + rk808->regmap=5Fcfg =3D &rk818=5Fregmap=5Fconfig;\n" - ">>>> + rk808->regmap=5Firq=5Fchip =3D &rk818=5Firq=5Fchip;\n" - ">>>> + rk808->pre=5Finit=5Freg =3D rk818=5Fpre=5Finit=5Freg;\n" - ">>>> + rk808->nr=5Fpre=5Finit=5Fregs =3D ARRAY=5FSIZE(rk818=5Fpre=5F=\n" - "init=5Freg);\n" + ">>>> + case RK818_ID:\n" + ">>>> + rk808->nr_cells = ARRAY_SIZE(rk818s);\n" + ">>>> + rk808->cells = rk818s;\n" + ">>>> + rk808->regmap_cfg = &rk818_regmap_config;\n" + ">>>> + rk808->regmap_irq_chip = &rk818_irq_chip;\n" + ">>>> + rk808->pre_init_reg = rk818_pre_init_reg;\n" + ">>>> + rk808->nr_pre_init_regs = ARRAY_SIZE(rk818_pre_init_reg);\n" ">>>> + break;\n" ">>>> + default:\n" - ">>>> + dev=5Ferr(dev, \"unsupported RK8XX ID %lu\\n\", rk808->variant);\n" + ">>>> + dev_err(dev, \"unsupported RK8XX ID %lu\\n\", rk808->variant);\n" ">>>> + return -EINVAL;\n" ">>>> + }\n" ">>>> +\n" ">>>> + return 0;\n" ">>>> +}\n" - ">>>> static int rk808=5Fprobe(struct i2c=5Fclient *client,\n" - ">>>> const struct i2c=5Fdevice=5Fid *id)\n" + ">>>> static int rk808_probe(struct i2c_client *client,\n" + ">>>> const struct i2c_device_id *id)\n" ">>>> {\n" - ">>>> @@ -176,46 +333,52 @@ static int rk808=5Fprobe(struct i2c=5Fclient\n" + ">>>> @@ -176,46 +333,52 @@ static int rk808_probe(struct i2c_client\n" ">>>> *client,\n" ">>>> int ret;\n" ">>>> int i;\n" ">>>> - if (!client->irq) {\n" - ">>>> - dev=5Ferr(&client->dev, \"No interrupt support, no core IRQ\\n\"=\n" - ");\n" + ">>>> - dev_err(&client->dev, \"No interrupt support, no core IRQ\\n\");\n" ">>>> - return -EINVAL;\n" ">>>> - }\n" ">>>> -\n" - ">>>> rk808 =3D devm=5Fkzalloc(&client->dev, sizeof(*rk808), GFP=5FKER=\n" - "NEL);\n" + ">>>> rk808 = devm_kzalloc(&client->dev, sizeof(*rk808), GFP_KERNEL);\n" ">>>> if (!rk808)\n" ">>>> return -ENOMEM;\n" - ">>>> - rk808->regmap =3D devm=5Fregmap=5Finit=5Fi2c(client,\n" - ">>>> &rk808=5Fregmap=5Fconfig);\n" - ">>>> + ret =3D rk8xx=5Fmatch=5Fdevice(rk808, &client->dev);\n" + ">>>> - rk808->regmap = devm_regmap_init_i2c(client,\n" + ">>>> &rk808_regmap_config);\n" + ">>>> + ret = rk8xx_match_device(rk808, &client->dev);\n" ">>> Is there a way to dynamically probe the device? No device ID you can\n" ">>> read directly from the silicon?\n" ">> AFAIK there is no device ID register. At least it is not documented in\n" @@ -390,6 +372,16 @@ "in your kernel tree.\n" "I would like to read the device ID from the register in the probe function.\n" "Do you want me to base my changes on top of this series or send a new\n" - version? + "version?\n" + "\n" + "-- \n" + "You received this message because you are subscribed to \"rtc-linux\".\n" + "Membership options at http://groups.google.com/group/rtc-linux .\n" + "Please read http://groups.google.com/group/rtc-linux/web/checklist\n" + "before submitting a driver.\n" + "--- \n" + "You received this message because you are subscribed to the Google Groups \"rtc-linux\" group.\n" + "To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org\n" + For more options, visit https://groups.google.com/d/optout. -e704dad1b9db78dff641b71fa10c12d7ff59a1234c094da3552788182b32011c +dba8e9a2e5d54c5f138caa1d1d0a1d4adcb2628a7a1bdcefd049657d8fa51e4e
diff --git a/a/1.txt b/N2/1.txt index eb51e05..c8c9cab 100644 --- a/a/1.txt +++ b/N2/1.txt @@ -40,17 +40,17 @@ On 06.07.2016 05:15, Andy Yan wrote: >>>> index 1bcf601..7ba464b 100644 >>>> --- a/drivers/mfd/Kconfig >>>> +++ b/drivers/mfd/Kconfig ->>>> @@ -839,13 +839,13 @@ config MFD=5FRC5T583 +>>>> @@ -839,13 +839,13 @@ config MFD_RC5T583 >>>> different functionality of the device. ->>>> config MFD=5FRK808 +>>>> config MFD_RK808 >>>> - tristate "Rockchip RK808 Power Management chip" >>>> + tristate "Rockchip RK808/RK818 Power Management chip" >>> "Chip" >>> >>>> depends on I2C && OF ->>>> select MFD=5FCORE ->>>> select REGMAP=5FI2C ->>>> select REGMAP=5FIRQ +>>>> select MFD_CORE +>>>> select REGMAP_I2C +>>>> select REGMAP_IRQ >>>> help >>>> - If you say yes here you get support for the RK808 >>>> + If you say yes here you get support for the RK808 and RK818 @@ -85,7 +85,7 @@ On 06.07.2016 05:15, Andy Yan wrote: >>>> #include <linux/module.h> >>>> #include <linux/regmap.h> >>>> - ->>>> -struct rk808=5Freg=5Fdata { +>>>> -struct rk808_reg_data { >>>> - int addr; >>>> - int mask; >>>> - int value; @@ -93,32 +93,30 @@ On 06.07.2016 05:15, Andy Yan wrote: >>> Why are you moving this to the header? >> It is now part of the rk808 struct. >> ->>>> +#include <linux/of=5Fdevice.h> ->>>> static bool rk808=5Fis=5Fvolatile=5Freg(struct device *dev, unsign= -ed +>>>> +#include <linux/of_device.h> +>>>> static bool rk808_is_volatile_reg(struct device *dev, unsigned >>>> int reg) >>>> { ->>>> @@ -57,6 +56,14 @@ static bool rk808=5Fis=5Fvolatile=5Freg(struct devi= -ce +>>>> @@ -57,6 +56,14 @@ static bool rk808_is_volatile_reg(struct device >>>> *dev, unsigned int reg) >>>> return false; >>>> } ->>>> +static const struct regmap=5Fconfig rk818=5Fregmap=5Fconfig =3D { ->>>> + .reg=5Fbits =3D 8, ->>>> + .val=5Fbits =3D 8, ->>>> + .max=5Fregister =3D RK818=5FUSB=5FCTRL=5FREG, ->>>> + .cache=5Ftype =3D REGCACHE=5FRBTREE, ->>>> + .volatile=5Freg =3D rk808=5Fis=5Fvolatile=5Freg, +>>>> +static const struct regmap_config rk818_regmap_config =3D { +>>>> + .reg_bits =3D 8, +>>>> + .val_bits =3D 8, +>>>> + .max_register =3D RK818_USB_CTRL_REG, +>>>> + .cache_type =3D REGCACHE_RBTREE, +>>>> + .volatile_reg =3D rk808_is_volatile_reg, >>>> +}; >>>> + ->>>> static const struct regmap=5Fconfig rk808=5Fregmap=5Fconfig =3D { ->>>> .reg=5Fbits =3D 8, ->>>> .val=5Fbits =3D 8, ->>>> @@ -83,7 +90,17 @@ static const struct mfd=5Fcell rk808s[] =3D { +>>>> static const struct regmap_config rk808_regmap_config =3D { +>>>> .reg_bits =3D 8, +>>>> .val_bits =3D 8, +>>>> @@ -83,7 +90,17 @@ static const struct mfd_cell rk808s[] =3D { >>>> }, >>>> }; ->>>> -static const struct rk808=5Freg=5Fdata pre=5Finit=5Freg[] =3D { ->>>> +static const struct mfd=5Fcell rk818s[] =3D { +>>>> -static const struct rk808_reg_data pre_init_reg[] =3D { +>>>> +static const struct mfd_cell rk818s[] =3D { >>>> + { .name =3D "rk808-clkout", }, >>> How does this differ to a normal -clock driver? >> I don't know. It is a normal clock driver. @@ -126,163 +124,153 @@ ce >>>> + { .name =3D "rk808-regulator", }, >>>> + { >>>> + .name =3D "rk808-rtc", ->>>> + .num=5Fresources =3D ARRAY=5FSIZE(rtc=5Fresources), ->>>> + .resources =3D &rtc=5Fresources[0], ->>> .resources =3D rtc=5Fresources, ? +>>>> + .num_resources =3D ARRAY_SIZE(rtc_resources), +>>>> + .resources =3D &rtc_resources[0], +>>> .resources =3D rtc_resources, ? >>> >>>> + }, >>>> +}; >>>> + ->>>> +static const struct rk8xx=5Freg=5Fdata rk808=5Fpre=5Finit=5Freg[] =3D= - { ->>>> { RK808=5FBUCK3=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FILM= -IN=5F150MA }, ->>>> { RK808=5FBUCK4=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FILM= -IN=5F200MA }, ->>>> { RK808=5FBOOST=5FCONFIG=5FREG, BOOST=5FILMIN=5FMASK, BOOST=5FIL= -MIN=5F100MA }, ->>>> @@ -94,6 +111,22 @@ static const struct rk808=5Freg=5Fdata ->>>> pre=5Finit=5Freg[] =3D { ->>>> VB=5FLO=5FSEL=5F3500MV }, +>>>> +static const struct rk8xx_reg_data rk808_pre_init_reg[] =3D { +>>>> { RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_150MA }, +>>>> { RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_200MA }, +>>>> { RK808_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA }, +>>>> @@ -94,6 +111,22 @@ static const struct rk808_reg_data +>>>> pre_init_reg[] =3D { +>>>> VB_LO_SEL_3500MV }, >>>> }; ->>>> +static const struct rk8xx=5Freg=5Fdata rk818=5Fpre=5Finit=5Freg[] = -=3D { ->>>> + { RK818=5FUSB=5FCTRL=5FREG, RK818=5FUSB=5FILIM=5FSEL=5FMASK, ->>>> + RK818=5FUSB=5FILMIN=5F2000MA }, +>>>> +static const struct rk8xx_reg_data rk818_pre_init_reg[] =3D { +>>>> + { RK818_USB_CTRL_REG, RK818_USB_ILIM_SEL_MASK, +>>>> + RK818_USB_ILMIN_2000MA }, >>>> + /* close charger when usb lower then 3.4V */ ->>>> + { RK818=5FUSB=5FCTRL=5FREG, RK818=5FUSB=5FCHG=5FSD=5FVSEL=5FMA= -SK, (0x7 << +>>>> + { RK818_USB_CTRL_REG, RK818_USB_CHG_SD_VSEL_MASK, (0x7 << >>>> 4) }, >>>> + /* no action when vref */ ->>>> + { RK818=5FH5V=5FEN=5FREG, BIT(1), RK818=5FREF=5FRDY=5FC= -TRL }, +>>>> + { RK818_H5V_EN_REG, BIT(1), RK818_REF_RDY_CTRL }, >>>> + /* enable HDMI 5V */ ->>>> + { RK818=5FH5V=5FEN=5FREG, BIT(0), RK818=5FH5V=5FEN }, +>>>> + { RK818_H5V_EN_REG, BIT(0), RK818_H5V_EN }, >>>> + /* improve efficiency */ ->>>> + { RK818=5FBUCK2=5FCONFIG=5FREG, BUCK2=5FRATE=5FMASK, BUCK=5FIL= -MIN=5F250MA }, ->>>> + { RK818=5FBUCK4=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FIL= -MIN=5F250MA }, ->>>> + { RK818=5FBOOST=5FCONFIG=5FREG, BOOST=5FILMIN=5FMASK, =20 ->>>> BOOST=5FILMIN=5F100MA }, ->>>> + { RK808=5FVB=5FMON=5FREG, MASK=5FALL, VB=5FLO=5FACT | ->>>> VB=5FLO=5FSEL=5F3500MV }, +>>>> + { RK818_BUCK2_CONFIG_REG, BUCK2_RATE_MASK, BUCK_ILMIN_250MA }, +>>>> + { RK818_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_250MA }, +>>>> + { RK818_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, =20 +>>>> BOOST_ILMIN_100MA }, +>>>> + { RK808_VB_MON_REG, MASK_ALL, VB_LO_ACT | +>>>> VB_LO_SEL_3500MV }, >>>> +}; >>> The alignment here looks odd. >> I will fix it in the next version. >> ->>>> static const struct regmap=5Firq rk808=5Firqs[] =3D { ->>>> /* INT=5FSTS */ ->>>> [RK808=5FIRQ=5FVOUT=5FLO] =3D { ->>>> @@ -136,6 +169,76 @@ static const struct regmap=5Firq rk808=5Firqs[] = -=3D { +>>>> static const struct regmap_irq rk808_irqs[] =3D { +>>>> /* INT_STS */ +>>>> [RK808_IRQ_VOUT_LO] =3D { +>>>> @@ -136,6 +169,76 @@ static const struct regmap_irq rk808_irqs[] =3D { >>>> }, >>>> }; ->>>> +static const struct regmap=5Firq rk818=5Firqs[] =3D { ->>>> + /* INT=5FSTS */ ->>>> + [RK818=5FIRQ=5FVOUT=5FLO] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FVOUT=5FLO=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> +static const struct regmap_irq rk818_irqs[] =3D { +>>>> + /* INT_STS */ +>>>> + [RK818_IRQ_VOUT_LO] =3D { +>>>> + .mask =3D RK818_IRQ_VOUT_LO_MSK, +>>>> + .reg_offset =3D 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FVB=5FLO] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FVB=5FLO=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_VB_LO] =3D { +>>>> + .mask =3D RK818_IRQ_VB_LO_MSK, +>>>> + .reg_offset =3D 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FPWRON] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FPWRON=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_PWRON] =3D { +>>>> + .mask =3D RK818_IRQ_PWRON_MSK, +>>>> + .reg_offset =3D 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FPWRON=5FLP] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FPWRON=5FLP=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_PWRON_LP] =3D { +>>>> + .mask =3D RK818_IRQ_PWRON_LP_MSK, +>>>> + .reg_offset =3D 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FHOTDIE] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FHOTDIE=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_HOTDIE] =3D { +>>>> + .mask =3D RK818_IRQ_HOTDIE_MSK, +>>>> + .reg_offset =3D 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FRTC=5FALARM] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FRTC=5FALARM=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_RTC_ALARM] =3D { +>>>> + .mask =3D RK818_IRQ_RTC_ALARM_MSK, +>>>> + .reg_offset =3D 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FRTC=5FPERIOD] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FRTC=5FPERIOD=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_RTC_PERIOD] =3D { +>>>> + .mask =3D RK818_IRQ_RTC_PERIOD_MSK, +>>>> + .reg_offset =3D 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FUSB=5FOV] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FUSB=5FOV=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_USB_OV] =3D { +>>>> + .mask =3D RK818_IRQ_USB_OV_MSK, +>>>> + .reg_offset =3D 0, >>>> + }, >>>> + ->>>> + /* INT=5FSTS2 */ ->>>> + [RK818=5FIRQ=5FPLUG=5FIN] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FPLUG=5FIN=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + /* INT_STS2 */ +>>>> + [RK818_IRQ_PLUG_IN] =3D { +>>>> + .mask =3D RK818_IRQ_PLUG_IN_MSK, +>>>> + .reg_offset =3D 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FPLUG=5FOUT] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FPLUG=5FOUT=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_PLUG_OUT] =3D { +>>>> + .mask =3D RK818_IRQ_PLUG_OUT_MSK, +>>>> + .reg_offset =3D 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FCHG=5FOK] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FCHG=5FOK=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_CHG_OK] =3D { +>>>> + .mask =3D RK818_IRQ_CHG_OK_MSK, +>>>> + .reg_offset =3D 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FCHG=5FTE] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FCHG=5FTE=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_CHG_TE] =3D { +>>>> + .mask =3D RK818_IRQ_CHG_TE_MSK, +>>>> + .reg_offset =3D 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FCHG=5FTS1] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FCHG=5FTS1=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_CHG_TS1] =3D { +>>>> + .mask =3D RK818_IRQ_CHG_TS1_MSK, +>>>> + .reg_offset =3D 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FTS2] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FTS2=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_TS2] =3D { +>>>> + .mask =3D RK818_IRQ_TS2_MSK, +>>>> + .reg_offset =3D 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FCHG=5FCVTLIM] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FCHG=5FCVTLIM=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_CHG_CVTLIM] =3D { +>>>> + .mask =3D RK818_IRQ_CHG_CVTLIM_MSK, +>>>> + .reg_offset =3D 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FDISCHG=5FILIM] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FDISCHG=5FILIM=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_DISCHG_ILIM] =3D { +>>>> + .mask =3D RK818_IRQ_DISCHG_ILIM_MSK, +>>>> + .reg_offset =3D 1, >>>> + }, >>>> +}; >>>> + ->>>> static struct regmap=5Firq=5Fchip rk808=5Firq=5Fchip =3D { +>>>> static struct regmap_irq_chip rk808_irq_chip =3D { >>>> .name =3D "rk808", ->>>> .irqs =3D rk808=5Firqs, ->>>> @@ -148,6 +251,18 @@ static struct regmap=5Firq=5Fchip rk808=5Firq=5Fc= -hip =3D { ->>>> .init=5Fack=5Fmasked =3D true, +>>>> .irqs =3D rk808_irqs, +>>>> @@ -148,6 +251,18 @@ static struct regmap_irq_chip rk808_irq_chip =3D = +{ +>>>> .init_ack_masked =3D true, >>>> }; ->>>> +static struct regmap=5Firq=5Fchip rk818=5Firq=5Fchip =3D { +>>>> +static struct regmap_irq_chip rk818_irq_chip =3D { >>>> + .name =3D "rk818", ->>>> + .irqs =3D rk818=5Firqs, ->>>> + .num=5Firqs =3D ARRAY=5FSIZE(rk818=5Firqs), ->>>> + .num=5Fregs =3D 2, ->>>> + .irq=5Freg=5Fstride =3D 2, ->>>> + .status=5Fbase =3D RK818=5FINT=5FSTS=5FREG1, ->>>> + .mask=5Fbase =3D RK818=5FINT=5FSTS=5FMSK=5FREG1, ->>>> + .ack=5Fbase =3D RK818=5FINT=5FSTS=5FREG1, ->>>> + .init=5Fack=5Fmasked =3D true, +>>>> + .irqs =3D rk818_irqs, +>>>> + .num_irqs =3D ARRAY_SIZE(rk818_irqs), +>>>> + .num_regs =3D 2, +>>>> + .irq_reg_stride =3D 2, +>>>> + .status_base =3D RK818_INT_STS_REG1, +>>>> + .mask_base =3D RK818_INT_STS_MSK_REG1, +>>>> + .ack_base =3D RK818_INT_STS_REG1, +>>>> + .init_ack_masked =3D true, >>>> +}; >>>> + ->>>> static struct i2c=5Fclient *rk808=5Fi2c=5Fclient; ->>>> static void rk808=5Fdevice=5Fshutdown(void) +>>>> static struct i2c_client *rk808_i2c_client; +>>>> static void rk808_device_shutdown(void) >>>> { ->>>> @@ -167,6 +282,48 @@ static void rk808=5Fdevice=5Fshutdown(void) ->>>> dev=5Ferr(&rk808=5Fi2c=5Fclient->dev, "power off error!\n"); +>>>> @@ -167,6 +282,48 @@ static void rk808_device_shutdown(void) +>>>> dev_err(&rk808_i2c_client->dev, "power off error!\n"); >>>> } ->>>> +static const struct of=5Fdevice=5Fid rk808=5Fof=5Fmatch[] =3D { ->>>> + { .compatible =3D "rockchip,rk808", .data =3D (void *) RK808=5FID= - }, ->>>> + { .compatible =3D "rockchip,rk818", .data =3D (void *) RK818=5FID= - }, +>>>> +static const struct of_device_id rk808_of_match[] =3D { +>>>> + { .compatible =3D "rockchip,rk808", .data =3D (void *) RK808_ID }= +, +>>>> + { .compatible =3D "rockchip,rk818", .data =3D (void *) RK818_ID }= +, >>>> + { }, >>>> +}; ->>>> +MODULE=5FDEVICE=5FTABLE(of, rk808=5Fof=5Fmatch); +>>>> +MODULE_DEVICE_TABLE(of, rk808_of_match); >>>> + ->>>> +static int rk8xx=5Fmatch=5Fdevice(struct rk808 *rk808, struct device +>>>> +static int rk8xx_match_device(struct rk808 *rk808, struct device >>>> *dev) >>> If you're going to do it this way, please switch these parameters. >>> @@ -290,61 +278,58 @@ hip =3D { >> If it's more common I will return a pointer to rk808. >> >>>> +{ ->>>> + const struct of=5Fdevice=5Fid *of=5Fid; +>>>> + const struct of_device_id *of_id; >>>> + ->>>> + of=5Fid =3D of=5Fmatch=5Fdevice(rk808=5Fof=5Fmatch, dev); ->>>> + if (!of=5Fid) { ->>>> + dev=5Ferr(dev, "Unable to match OF ID\n"); +>>>> + of_id =3D of_match_device(rk808_of_match, dev); +>>>> + if (!of_id) { +>>>> + dev_err(dev, "Unable to match OF ID\n"); >>>> + return -ENODEV; >>>> + } ->>>> + rk808->variant =3D (long) of=5Fid->data; +>>>> + rk808->variant =3D (long) of_id->data; >>>> + >>>> + switch (rk808->variant) { ->>>> + case RK808=5FID: ->>>> + rk808->nr=5Fcells =3D ARRAY=5FSIZE(rk808s); +>>>> + case RK808_ID: +>>>> + rk808->nr_cells =3D ARRAY_SIZE(rk808s); >>>> + rk808->cells =3D rk808s; ->>>> + rk808->regmap=5Fcfg =3D &rk808=5Fregmap=5Fconfig; ->>>> + rk808->regmap=5Firq=5Fchip =3D &rk808=5Firq=5Fchip; ->>>> + rk808->pre=5Finit=5Freg =3D rk808=5Fpre=5Finit=5Freg; ->>>> + rk808->nr=5Fpre=5Finit=5Fregs =3D ARRAY=5FSIZE(rk808=5Fpre=5F= -init=5Freg); +>>>> + rk808->regmap_cfg =3D &rk808_regmap_config; +>>>> + rk808->regmap_irq_chip =3D &rk808_irq_chip; +>>>> + rk808->pre_init_reg =3D rk808_pre_init_reg; +>>>> + rk808->nr_pre_init_regs =3D ARRAY_SIZE(rk808_pre_init_reg); >>>> + break; ->>>> + case RK818=5FID: ->>>> + rk808->nr=5Fcells =3D ARRAY=5FSIZE(rk818s); +>>>> + case RK818_ID: +>>>> + rk808->nr_cells =3D ARRAY_SIZE(rk818s); >>>> + rk808->cells =3D rk818s; ->>>> + rk808->regmap=5Fcfg =3D &rk818=5Fregmap=5Fconfig; ->>>> + rk808->regmap=5Firq=5Fchip =3D &rk818=5Firq=5Fchip; ->>>> + rk808->pre=5Finit=5Freg =3D rk818=5Fpre=5Finit=5Freg; ->>>> + rk808->nr=5Fpre=5Finit=5Fregs =3D ARRAY=5FSIZE(rk818=5Fpre=5F= -init=5Freg); +>>>> + rk808->regmap_cfg =3D &rk818_regmap_config; +>>>> + rk808->regmap_irq_chip =3D &rk818_irq_chip; +>>>> + rk808->pre_init_reg =3D rk818_pre_init_reg; +>>>> + rk808->nr_pre_init_regs =3D ARRAY_SIZE(rk818_pre_init_reg); >>>> + break; >>>> + default: ->>>> + dev=5Ferr(dev, "unsupported RK8XX ID %lu\n", rk808->variant); +>>>> + dev_err(dev, "unsupported RK8XX ID %lu\n", rk808->variant); >>>> + return -EINVAL; >>>> + } >>>> + >>>> + return 0; >>>> +} ->>>> static int rk808=5Fprobe(struct i2c=5Fclient *client, ->>>> const struct i2c=5Fdevice=5Fid *id) +>>>> static int rk808_probe(struct i2c_client *client, +>>>> const struct i2c_device_id *id) >>>> { ->>>> @@ -176,46 +333,52 @@ static int rk808=5Fprobe(struct i2c=5Fclient +>>>> @@ -176,46 +333,52 @@ static int rk808_probe(struct i2c_client >>>> *client, >>>> int ret; >>>> int i; >>>> - if (!client->irq) { ->>>> - dev=5Ferr(&client->dev, "No interrupt support, no core IRQ\n"= -); +>>>> - dev_err(&client->dev, "No interrupt support, no core IRQ\n"); >>>> - return -EINVAL; >>>> - } >>>> - ->>>> rk808 =3D devm=5Fkzalloc(&client->dev, sizeof(*rk808), GFP=5FKER= -NEL); +>>>> rk808 =3D devm_kzalloc(&client->dev, sizeof(*rk808), GFP_KERNEL)= +; >>>> if (!rk808) >>>> return -ENOMEM; ->>>> - rk808->regmap =3D devm=5Fregmap=5Finit=5Fi2c(client, ->>>> &rk808=5Fregmap=5Fconfig); ->>>> + ret =3D rk8xx=5Fmatch=5Fdevice(rk808, &client->dev); +>>>> - rk808->regmap =3D devm_regmap_init_i2c(client, +>>>> &rk808_regmap_config); +>>>> + ret =3D rk8xx_match_device(rk808, &client->dev); >>> Is there a way to dynamically probe the device? No device ID you can >>> read directly from the silicon? >> AFAIK there is no device ID register. At least it is not documented in @@ -362,3 +347,15 @@ in your kernel tree. I would like to read the device ID from the register in the probe function. Do you want me to base my changes on top of this series or send a new version? + +--=20 +You received this message because you are subscribed to "rtc-linux". +Membership options at http://groups.google.com/group/rtc-linux . +Please read http://groups.google.com/group/rtc-linux/web/checklist +before submitting a driver. +---=20 +You received this message because you are subscribed to the Google Groups "= +rtc-linux" group. +To unsubscribe from this group and stop receiving emails from it, send an e= +mail to rtc-linux+unsubscribe@googlegroups.com. +For more options, visit https://groups.google.com/d/optout. diff --git a/a/content_digest b/N2/content_digest index 568572d..c92dadd 100644 --- a/a/content_digest +++ b/N2/content_digest @@ -3,7 +3,7 @@ "ref\05759277D.7090101@phytec.de\0" "ref\0577C77DF.9060706@rock-chips.com\0" "From\0Wadim Egorov <w.egorov@phytec.de>\0" - "Subject\0Re: [RESEND PATCH v5 1/5] mfd: RK808: Add RK818 support\0" + "Subject\0[rtc-linux] Re: [RESEND PATCH v5 1/5] mfd: RK808: Add RK818 support\0" "Date\0Wed, 6 Jul 2016 10:03:46 +0200\0" "To\0Andy Yan <andy.yan@rock-chips.com>" " Lee Jones <lee.jones@linaro.org>\0" @@ -69,17 +69,17 @@ ">>>> index 1bcf601..7ba464b 100644\n" ">>>> --- a/drivers/mfd/Kconfig\n" ">>>> +++ b/drivers/mfd/Kconfig\n" - ">>>> @@ -839,13 +839,13 @@ config MFD=5FRC5T583\n" + ">>>> @@ -839,13 +839,13 @@ config MFD_RC5T583\n" ">>>> different functionality of the device.\n" - ">>>> config MFD=5FRK808\n" + ">>>> config MFD_RK808\n" ">>>> - tristate \"Rockchip RK808 Power Management chip\"\n" ">>>> + tristate \"Rockchip RK808/RK818 Power Management chip\"\n" ">>> \"Chip\"\n" ">>>\n" ">>>> depends on I2C && OF\n" - ">>>> select MFD=5FCORE\n" - ">>>> select REGMAP=5FI2C\n" - ">>>> select REGMAP=5FIRQ\n" + ">>>> select MFD_CORE\n" + ">>>> select REGMAP_I2C\n" + ">>>> select REGMAP_IRQ\n" ">>>> help\n" ">>>> - If you say yes here you get support for the RK808\n" ">>>> + If you say yes here you get support for the RK808 and RK818\n" @@ -114,7 +114,7 @@ ">>>> #include <linux/module.h>\n" ">>>> #include <linux/regmap.h>\n" ">>>> -\n" - ">>>> -struct rk808=5Freg=5Fdata {\n" + ">>>> -struct rk808_reg_data {\n" ">>>> - int addr;\n" ">>>> - int mask;\n" ">>>> - int value;\n" @@ -122,32 +122,30 @@ ">>> Why are you moving this to the header?\n" ">> It is now part of the rk808 struct.\n" ">>\n" - ">>>> +#include <linux/of=5Fdevice.h>\n" - ">>>> static bool rk808=5Fis=5Fvolatile=5Freg(struct device *dev, unsign=\n" - "ed\n" + ">>>> +#include <linux/of_device.h>\n" + ">>>> static bool rk808_is_volatile_reg(struct device *dev, unsigned\n" ">>>> int reg)\n" ">>>> {\n" - ">>>> @@ -57,6 +56,14 @@ static bool rk808=5Fis=5Fvolatile=5Freg(struct devi=\n" - "ce\n" + ">>>> @@ -57,6 +56,14 @@ static bool rk808_is_volatile_reg(struct device\n" ">>>> *dev, unsigned int reg)\n" ">>>> return false;\n" ">>>> }\n" - ">>>> +static const struct regmap=5Fconfig rk818=5Fregmap=5Fconfig =3D {\n" - ">>>> + .reg=5Fbits =3D 8,\n" - ">>>> + .val=5Fbits =3D 8,\n" - ">>>> + .max=5Fregister =3D RK818=5FUSB=5FCTRL=5FREG,\n" - ">>>> + .cache=5Ftype =3D REGCACHE=5FRBTREE,\n" - ">>>> + .volatile=5Freg =3D rk808=5Fis=5Fvolatile=5Freg,\n" + ">>>> +static const struct regmap_config rk818_regmap_config =3D {\n" + ">>>> + .reg_bits =3D 8,\n" + ">>>> + .val_bits =3D 8,\n" + ">>>> + .max_register =3D RK818_USB_CTRL_REG,\n" + ">>>> + .cache_type =3D REGCACHE_RBTREE,\n" + ">>>> + .volatile_reg =3D rk808_is_volatile_reg,\n" ">>>> +};\n" ">>>> +\n" - ">>>> static const struct regmap=5Fconfig rk808=5Fregmap=5Fconfig =3D {\n" - ">>>> .reg=5Fbits =3D 8,\n" - ">>>> .val=5Fbits =3D 8,\n" - ">>>> @@ -83,7 +90,17 @@ static const struct mfd=5Fcell rk808s[] =3D {\n" + ">>>> static const struct regmap_config rk808_regmap_config =3D {\n" + ">>>> .reg_bits =3D 8,\n" + ">>>> .val_bits =3D 8,\n" + ">>>> @@ -83,7 +90,17 @@ static const struct mfd_cell rk808s[] =3D {\n" ">>>> },\n" ">>>> };\n" - ">>>> -static const struct rk808=5Freg=5Fdata pre=5Finit=5Freg[] =3D {\n" - ">>>> +static const struct mfd=5Fcell rk818s[] =3D {\n" + ">>>> -static const struct rk808_reg_data pre_init_reg[] =3D {\n" + ">>>> +static const struct mfd_cell rk818s[] =3D {\n" ">>>> + { .name =3D \"rk808-clkout\", },\n" ">>> How does this differ to a normal -clock driver?\n" ">> I don't know. It is a normal clock driver.\n" @@ -155,163 +153,153 @@ ">>>> + { .name =3D \"rk808-regulator\", },\n" ">>>> + {\n" ">>>> + .name =3D \"rk808-rtc\",\n" - ">>>> + .num=5Fresources =3D ARRAY=5FSIZE(rtc=5Fresources),\n" - ">>>> + .resources =3D &rtc=5Fresources[0],\n" - ">>> .resources =3D rtc=5Fresources, ?\n" + ">>>> + .num_resources =3D ARRAY_SIZE(rtc_resources),\n" + ">>>> + .resources =3D &rtc_resources[0],\n" + ">>> .resources =3D rtc_resources, ?\n" ">>>\n" ">>>> + },\n" ">>>> +};\n" ">>>> +\n" - ">>>> +static const struct rk8xx=5Freg=5Fdata rk808=5Fpre=5Finit=5Freg[] =3D=\n" - " {\n" - ">>>> { RK808=5FBUCK3=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FILM=\n" - "IN=5F150MA },\n" - ">>>> { RK808=5FBUCK4=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FILM=\n" - "IN=5F200MA },\n" - ">>>> { RK808=5FBOOST=5FCONFIG=5FREG, BOOST=5FILMIN=5FMASK, BOOST=5FIL=\n" - "MIN=5F100MA },\n" - ">>>> @@ -94,6 +111,22 @@ static const struct rk808=5Freg=5Fdata\n" - ">>>> pre=5Finit=5Freg[] =3D {\n" - ">>>> VB=5FLO=5FSEL=5F3500MV },\n" + ">>>> +static const struct rk8xx_reg_data rk808_pre_init_reg[] =3D {\n" + ">>>> { RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_150MA },\n" + ">>>> { RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_200MA },\n" + ">>>> { RK808_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },\n" + ">>>> @@ -94,6 +111,22 @@ static const struct rk808_reg_data\n" + ">>>> pre_init_reg[] =3D {\n" + ">>>> VB_LO_SEL_3500MV },\n" ">>>> };\n" - ">>>> +static const struct rk8xx=5Freg=5Fdata rk818=5Fpre=5Finit=5Freg[] =\n" - "=3D {\n" - ">>>> + { RK818=5FUSB=5FCTRL=5FREG, RK818=5FUSB=5FILIM=5FSEL=5FMASK,\n" - ">>>> + RK818=5FUSB=5FILMIN=5F2000MA },\n" + ">>>> +static const struct rk8xx_reg_data rk818_pre_init_reg[] =3D {\n" + ">>>> + { RK818_USB_CTRL_REG, RK818_USB_ILIM_SEL_MASK,\n" + ">>>> + RK818_USB_ILMIN_2000MA },\n" ">>>> + /* close charger when usb lower then 3.4V */\n" - ">>>> + { RK818=5FUSB=5FCTRL=5FREG, RK818=5FUSB=5FCHG=5FSD=5FVSEL=5FMA=\n" - "SK, (0x7 <<\n" + ">>>> + { RK818_USB_CTRL_REG, RK818_USB_CHG_SD_VSEL_MASK, (0x7 <<\n" ">>>> 4) },\n" ">>>> + /* no action when vref */\n" - ">>>> + { RK818=5FH5V=5FEN=5FREG, BIT(1), RK818=5FREF=5FRDY=5FC=\n" - "TRL },\n" + ">>>> + { RK818_H5V_EN_REG, BIT(1), RK818_REF_RDY_CTRL },\n" ">>>> + /* enable HDMI 5V */\n" - ">>>> + { RK818=5FH5V=5FEN=5FREG, BIT(0), RK818=5FH5V=5FEN },\n" + ">>>> + { RK818_H5V_EN_REG, BIT(0), RK818_H5V_EN },\n" ">>>> + /* improve efficiency */\n" - ">>>> + { RK818=5FBUCK2=5FCONFIG=5FREG, BUCK2=5FRATE=5FMASK, BUCK=5FIL=\n" - "MIN=5F250MA },\n" - ">>>> + { RK818=5FBUCK4=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FIL=\n" - "MIN=5F250MA },\n" - ">>>> + { RK818=5FBOOST=5FCONFIG=5FREG, BOOST=5FILMIN=5FMASK, =20\n" - ">>>> BOOST=5FILMIN=5F100MA },\n" - ">>>> + { RK808=5FVB=5FMON=5FREG, MASK=5FALL, VB=5FLO=5FACT |\n" - ">>>> VB=5FLO=5FSEL=5F3500MV },\n" + ">>>> + { RK818_BUCK2_CONFIG_REG, BUCK2_RATE_MASK, BUCK_ILMIN_250MA },\n" + ">>>> + { RK818_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_250MA },\n" + ">>>> + { RK818_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, =20\n" + ">>>> BOOST_ILMIN_100MA },\n" + ">>>> + { RK808_VB_MON_REG, MASK_ALL, VB_LO_ACT |\n" + ">>>> VB_LO_SEL_3500MV },\n" ">>>> +};\n" ">>> The alignment here looks odd.\n" ">> I will fix it in the next version.\n" ">>\n" - ">>>> static const struct regmap=5Firq rk808=5Firqs[] =3D {\n" - ">>>> /* INT=5FSTS */\n" - ">>>> [RK808=5FIRQ=5FVOUT=5FLO] =3D {\n" - ">>>> @@ -136,6 +169,76 @@ static const struct regmap=5Firq rk808=5Firqs[] =\n" - "=3D {\n" + ">>>> static const struct regmap_irq rk808_irqs[] =3D {\n" + ">>>> /* INT_STS */\n" + ">>>> [RK808_IRQ_VOUT_LO] =3D {\n" + ">>>> @@ -136,6 +169,76 @@ static const struct regmap_irq rk808_irqs[] =3D {\n" ">>>> },\n" ">>>> };\n" - ">>>> +static const struct regmap=5Firq rk818=5Firqs[] =3D {\n" - ">>>> + /* INT=5FSTS */\n" - ">>>> + [RK818=5FIRQ=5FVOUT=5FLO] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FVOUT=5FLO=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> +static const struct regmap_irq rk818_irqs[] =3D {\n" + ">>>> + /* INT_STS */\n" + ">>>> + [RK818_IRQ_VOUT_LO] =3D {\n" + ">>>> + .mask =3D RK818_IRQ_VOUT_LO_MSK,\n" + ">>>> + .reg_offset =3D 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FVB=5FLO] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FVB=5FLO=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_VB_LO] =3D {\n" + ">>>> + .mask =3D RK818_IRQ_VB_LO_MSK,\n" + ">>>> + .reg_offset =3D 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FPWRON] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FPWRON=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_PWRON] =3D {\n" + ">>>> + .mask =3D RK818_IRQ_PWRON_MSK,\n" + ">>>> + .reg_offset =3D 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FPWRON=5FLP] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FPWRON=5FLP=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_PWRON_LP] =3D {\n" + ">>>> + .mask =3D RK818_IRQ_PWRON_LP_MSK,\n" + ">>>> + .reg_offset =3D 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FHOTDIE] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FHOTDIE=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_HOTDIE] =3D {\n" + ">>>> + .mask =3D RK818_IRQ_HOTDIE_MSK,\n" + ">>>> + .reg_offset =3D 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FRTC=5FALARM] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FRTC=5FALARM=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_RTC_ALARM] =3D {\n" + ">>>> + .mask =3D RK818_IRQ_RTC_ALARM_MSK,\n" + ">>>> + .reg_offset =3D 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FRTC=5FPERIOD] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FRTC=5FPERIOD=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_RTC_PERIOD] =3D {\n" + ">>>> + .mask =3D RK818_IRQ_RTC_PERIOD_MSK,\n" + ">>>> + .reg_offset =3D 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FUSB=5FOV] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FUSB=5FOV=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_USB_OV] =3D {\n" + ">>>> + .mask =3D RK818_IRQ_USB_OV_MSK,\n" + ">>>> + .reg_offset =3D 0,\n" ">>>> + },\n" ">>>> +\n" - ">>>> + /* INT=5FSTS2 */\n" - ">>>> + [RK818=5FIRQ=5FPLUG=5FIN] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FPLUG=5FIN=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + /* INT_STS2 */\n" + ">>>> + [RK818_IRQ_PLUG_IN] =3D {\n" + ">>>> + .mask =3D RK818_IRQ_PLUG_IN_MSK,\n" + ">>>> + .reg_offset =3D 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FPLUG=5FOUT] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FPLUG=5FOUT=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_PLUG_OUT] =3D {\n" + ">>>> + .mask =3D RK818_IRQ_PLUG_OUT_MSK,\n" + ">>>> + .reg_offset =3D 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FCHG=5FOK] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FCHG=5FOK=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_CHG_OK] =3D {\n" + ">>>> + .mask =3D RK818_IRQ_CHG_OK_MSK,\n" + ">>>> + .reg_offset =3D 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FCHG=5FTE] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FCHG=5FTE=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_CHG_TE] =3D {\n" + ">>>> + .mask =3D RK818_IRQ_CHG_TE_MSK,\n" + ">>>> + .reg_offset =3D 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FCHG=5FTS1] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FCHG=5FTS1=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_CHG_TS1] =3D {\n" + ">>>> + .mask =3D RK818_IRQ_CHG_TS1_MSK,\n" + ">>>> + .reg_offset =3D 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FTS2] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FTS2=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_TS2] =3D {\n" + ">>>> + .mask =3D RK818_IRQ_TS2_MSK,\n" + ">>>> + .reg_offset =3D 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FCHG=5FCVTLIM] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FCHG=5FCVTLIM=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_CHG_CVTLIM] =3D {\n" + ">>>> + .mask =3D RK818_IRQ_CHG_CVTLIM_MSK,\n" + ">>>> + .reg_offset =3D 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FDISCHG=5FILIM] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FDISCHG=5FILIM=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_DISCHG_ILIM] =3D {\n" + ">>>> + .mask =3D RK818_IRQ_DISCHG_ILIM_MSK,\n" + ">>>> + .reg_offset =3D 1,\n" ">>>> + },\n" ">>>> +};\n" ">>>> +\n" - ">>>> static struct regmap=5Firq=5Fchip rk808=5Firq=5Fchip =3D {\n" + ">>>> static struct regmap_irq_chip rk808_irq_chip =3D {\n" ">>>> .name =3D \"rk808\",\n" - ">>>> .irqs =3D rk808=5Firqs,\n" - ">>>> @@ -148,6 +251,18 @@ static struct regmap=5Firq=5Fchip rk808=5Firq=5Fc=\n" - "hip =3D {\n" - ">>>> .init=5Fack=5Fmasked =3D true,\n" + ">>>> .irqs =3D rk808_irqs,\n" + ">>>> @@ -148,6 +251,18 @@ static struct regmap_irq_chip rk808_irq_chip =3D =\n" + "{\n" + ">>>> .init_ack_masked =3D true,\n" ">>>> };\n" - ">>>> +static struct regmap=5Firq=5Fchip rk818=5Firq=5Fchip =3D {\n" + ">>>> +static struct regmap_irq_chip rk818_irq_chip =3D {\n" ">>>> + .name =3D \"rk818\",\n" - ">>>> + .irqs =3D rk818=5Firqs,\n" - ">>>> + .num=5Firqs =3D ARRAY=5FSIZE(rk818=5Firqs),\n" - ">>>> + .num=5Fregs =3D 2,\n" - ">>>> + .irq=5Freg=5Fstride =3D 2,\n" - ">>>> + .status=5Fbase =3D RK818=5FINT=5FSTS=5FREG1,\n" - ">>>> + .mask=5Fbase =3D RK818=5FINT=5FSTS=5FMSK=5FREG1,\n" - ">>>> + .ack=5Fbase =3D RK818=5FINT=5FSTS=5FREG1,\n" - ">>>> + .init=5Fack=5Fmasked =3D true,\n" + ">>>> + .irqs =3D rk818_irqs,\n" + ">>>> + .num_irqs =3D ARRAY_SIZE(rk818_irqs),\n" + ">>>> + .num_regs =3D 2,\n" + ">>>> + .irq_reg_stride =3D 2,\n" + ">>>> + .status_base =3D RK818_INT_STS_REG1,\n" + ">>>> + .mask_base =3D RK818_INT_STS_MSK_REG1,\n" + ">>>> + .ack_base =3D RK818_INT_STS_REG1,\n" + ">>>> + .init_ack_masked =3D true,\n" ">>>> +};\n" ">>>> +\n" - ">>>> static struct i2c=5Fclient *rk808=5Fi2c=5Fclient;\n" - ">>>> static void rk808=5Fdevice=5Fshutdown(void)\n" + ">>>> static struct i2c_client *rk808_i2c_client;\n" + ">>>> static void rk808_device_shutdown(void)\n" ">>>> {\n" - ">>>> @@ -167,6 +282,48 @@ static void rk808=5Fdevice=5Fshutdown(void)\n" - ">>>> dev=5Ferr(&rk808=5Fi2c=5Fclient->dev, \"power off error!\\n\");\n" + ">>>> @@ -167,6 +282,48 @@ static void rk808_device_shutdown(void)\n" + ">>>> dev_err(&rk808_i2c_client->dev, \"power off error!\\n\");\n" ">>>> }\n" - ">>>> +static const struct of=5Fdevice=5Fid rk808=5Fof=5Fmatch[] =3D {\n" - ">>>> + { .compatible =3D \"rockchip,rk808\", .data =3D (void *) RK808=5FID=\n" - " },\n" - ">>>> + { .compatible =3D \"rockchip,rk818\", .data =3D (void *) RK818=5FID=\n" - " },\n" + ">>>> +static const struct of_device_id rk808_of_match[] =3D {\n" + ">>>> + { .compatible =3D \"rockchip,rk808\", .data =3D (void *) RK808_ID }=\n" + ",\n" + ">>>> + { .compatible =3D \"rockchip,rk818\", .data =3D (void *) RK818_ID }=\n" + ",\n" ">>>> + { },\n" ">>>> +};\n" - ">>>> +MODULE=5FDEVICE=5FTABLE(of, rk808=5Fof=5Fmatch);\n" + ">>>> +MODULE_DEVICE_TABLE(of, rk808_of_match);\n" ">>>> +\n" - ">>>> +static int rk8xx=5Fmatch=5Fdevice(struct rk808 *rk808, struct device\n" + ">>>> +static int rk8xx_match_device(struct rk808 *rk808, struct device\n" ">>>> *dev)\n" ">>> If you're going to do it this way, please switch these parameters.\n" ">>>\n" @@ -319,61 +307,58 @@ ">> If it's more common I will return a pointer to rk808.\n" ">>\n" ">>>> +{\n" - ">>>> + const struct of=5Fdevice=5Fid *of=5Fid;\n" + ">>>> + const struct of_device_id *of_id;\n" ">>>> +\n" - ">>>> + of=5Fid =3D of=5Fmatch=5Fdevice(rk808=5Fof=5Fmatch, dev);\n" - ">>>> + if (!of=5Fid) {\n" - ">>>> + dev=5Ferr(dev, \"Unable to match OF ID\\n\");\n" + ">>>> + of_id =3D of_match_device(rk808_of_match, dev);\n" + ">>>> + if (!of_id) {\n" + ">>>> + dev_err(dev, \"Unable to match OF ID\\n\");\n" ">>>> + return -ENODEV;\n" ">>>> + }\n" - ">>>> + rk808->variant =3D (long) of=5Fid->data;\n" + ">>>> + rk808->variant =3D (long) of_id->data;\n" ">>>> +\n" ">>>> + switch (rk808->variant) {\n" - ">>>> + case RK808=5FID:\n" - ">>>> + rk808->nr=5Fcells =3D ARRAY=5FSIZE(rk808s);\n" + ">>>> + case RK808_ID:\n" + ">>>> + rk808->nr_cells =3D ARRAY_SIZE(rk808s);\n" ">>>> + rk808->cells =3D rk808s;\n" - ">>>> + rk808->regmap=5Fcfg =3D &rk808=5Fregmap=5Fconfig;\n" - ">>>> + rk808->regmap=5Firq=5Fchip =3D &rk808=5Firq=5Fchip;\n" - ">>>> + rk808->pre=5Finit=5Freg =3D rk808=5Fpre=5Finit=5Freg;\n" - ">>>> + rk808->nr=5Fpre=5Finit=5Fregs =3D ARRAY=5FSIZE(rk808=5Fpre=5F=\n" - "init=5Freg);\n" + ">>>> + rk808->regmap_cfg =3D &rk808_regmap_config;\n" + ">>>> + rk808->regmap_irq_chip =3D &rk808_irq_chip;\n" + ">>>> + rk808->pre_init_reg =3D rk808_pre_init_reg;\n" + ">>>> + rk808->nr_pre_init_regs =3D ARRAY_SIZE(rk808_pre_init_reg);\n" ">>>> + break;\n" - ">>>> + case RK818=5FID:\n" - ">>>> + rk808->nr=5Fcells =3D ARRAY=5FSIZE(rk818s);\n" + ">>>> + case RK818_ID:\n" + ">>>> + rk808->nr_cells =3D ARRAY_SIZE(rk818s);\n" ">>>> + rk808->cells =3D rk818s;\n" - ">>>> + rk808->regmap=5Fcfg =3D &rk818=5Fregmap=5Fconfig;\n" - ">>>> + rk808->regmap=5Firq=5Fchip =3D &rk818=5Firq=5Fchip;\n" - ">>>> + rk808->pre=5Finit=5Freg =3D rk818=5Fpre=5Finit=5Freg;\n" - ">>>> + rk808->nr=5Fpre=5Finit=5Fregs =3D ARRAY=5FSIZE(rk818=5Fpre=5F=\n" - "init=5Freg);\n" + ">>>> + rk808->regmap_cfg =3D &rk818_regmap_config;\n" + ">>>> + rk808->regmap_irq_chip =3D &rk818_irq_chip;\n" + ">>>> + rk808->pre_init_reg =3D rk818_pre_init_reg;\n" + ">>>> + rk808->nr_pre_init_regs =3D ARRAY_SIZE(rk818_pre_init_reg);\n" ">>>> + break;\n" ">>>> + default:\n" - ">>>> + dev=5Ferr(dev, \"unsupported RK8XX ID %lu\\n\", rk808->variant);\n" + ">>>> + dev_err(dev, \"unsupported RK8XX ID %lu\\n\", rk808->variant);\n" ">>>> + return -EINVAL;\n" ">>>> + }\n" ">>>> +\n" ">>>> + return 0;\n" ">>>> +}\n" - ">>>> static int rk808=5Fprobe(struct i2c=5Fclient *client,\n" - ">>>> const struct i2c=5Fdevice=5Fid *id)\n" + ">>>> static int rk808_probe(struct i2c_client *client,\n" + ">>>> const struct i2c_device_id *id)\n" ">>>> {\n" - ">>>> @@ -176,46 +333,52 @@ static int rk808=5Fprobe(struct i2c=5Fclient\n" + ">>>> @@ -176,46 +333,52 @@ static int rk808_probe(struct i2c_client\n" ">>>> *client,\n" ">>>> int ret;\n" ">>>> int i;\n" ">>>> - if (!client->irq) {\n" - ">>>> - dev=5Ferr(&client->dev, \"No interrupt support, no core IRQ\\n\"=\n" - ");\n" + ">>>> - dev_err(&client->dev, \"No interrupt support, no core IRQ\\n\");\n" ">>>> - return -EINVAL;\n" ">>>> - }\n" ">>>> -\n" - ">>>> rk808 =3D devm=5Fkzalloc(&client->dev, sizeof(*rk808), GFP=5FKER=\n" - "NEL);\n" + ">>>> rk808 =3D devm_kzalloc(&client->dev, sizeof(*rk808), GFP_KERNEL)=\n" + ";\n" ">>>> if (!rk808)\n" ">>>> return -ENOMEM;\n" - ">>>> - rk808->regmap =3D devm=5Fregmap=5Finit=5Fi2c(client,\n" - ">>>> &rk808=5Fregmap=5Fconfig);\n" - ">>>> + ret =3D rk8xx=5Fmatch=5Fdevice(rk808, &client->dev);\n" + ">>>> - rk808->regmap =3D devm_regmap_init_i2c(client,\n" + ">>>> &rk808_regmap_config);\n" + ">>>> + ret =3D rk8xx_match_device(rk808, &client->dev);\n" ">>> Is there a way to dynamically probe the device? No device ID you can\n" ">>> read directly from the silicon?\n" ">> AFAIK there is no device ID register. At least it is not documented in\n" @@ -390,6 +375,18 @@ "in your kernel tree.\n" "I would like to read the device ID from the register in the probe function.\n" "Do you want me to base my changes on top of this series or send a new\n" - version? + "version?\n" + "\n" + "--=20\n" + "You received this message because you are subscribed to \"rtc-linux\".\n" + "Membership options at http://groups.google.com/group/rtc-linux .\n" + "Please read http://groups.google.com/group/rtc-linux/web/checklist\n" + "before submitting a driver.\n" + "---=20\n" + "You received this message because you are subscribed to the Google Groups \"=\n" + "rtc-linux\" group.\n" + "To unsubscribe from this group and stop receiving emails from it, send an e=\n" + "mail to rtc-linux+unsubscribe@googlegroups.com.\n" + For more options, visit https://groups.google.com/d/optout. -e704dad1b9db78dff641b71fa10c12d7ff59a1234c094da3552788182b32011c +34f222843d467d84f8d8d18d3bbb3dfc7f205072955c53b5d39d6326632aa5e3
diff --git a/a/1.txt b/N3/1.txt index eb51e05..94acdf2 100644 --- a/a/1.txt +++ b/N3/1.txt @@ -3,7 +3,7 @@ Hi Andy, On 06.07.2016 05:15, Andy Yan wrote: > Hi Wadim: > -> On 2016=E5=B9=B406=E6=9C=8809=E6=97=A5 16:23, Wadim Egorov wrote: +> On 2016年06月09日 16:23, Wadim Egorov wrote: >> Hi, >> >> On 08.06.2016 16:17, Lee Jones wrote: @@ -40,17 +40,17 @@ On 06.07.2016 05:15, Andy Yan wrote: >>>> index 1bcf601..7ba464b 100644 >>>> --- a/drivers/mfd/Kconfig >>>> +++ b/drivers/mfd/Kconfig ->>>> @@ -839,13 +839,13 @@ config MFD=5FRC5T583 +>>>> @@ -839,13 +839,13 @@ config MFD_RC5T583 >>>> different functionality of the device. ->>>> config MFD=5FRK808 +>>>> config MFD_RK808 >>>> - tristate "Rockchip RK808 Power Management chip" >>>> + tristate "Rockchip RK808/RK818 Power Management chip" >>> "Chip" >>> >>>> depends on I2C && OF ->>>> select MFD=5FCORE ->>>> select REGMAP=5FI2C ->>>> select REGMAP=5FIRQ +>>>> select MFD_CORE +>>>> select REGMAP_I2C +>>>> select REGMAP_IRQ >>>> help >>>> - If you say yes here you get support for the RK808 >>>> + If you say yes here you get support for the RK808 and RK818 @@ -85,7 +85,7 @@ On 06.07.2016 05:15, Andy Yan wrote: >>>> #include <linux/module.h> >>>> #include <linux/regmap.h> >>>> - ->>>> -struct rk808=5Freg=5Fdata { +>>>> -struct rk808_reg_data { >>>> - int addr; >>>> - int mask; >>>> - int value; @@ -93,196 +93,181 @@ On 06.07.2016 05:15, Andy Yan wrote: >>> Why are you moving this to the header? >> It is now part of the rk808 struct. >> ->>>> +#include <linux/of=5Fdevice.h> ->>>> static bool rk808=5Fis=5Fvolatile=5Freg(struct device *dev, unsign= -ed +>>>> +#include <linux/of_device.h> +>>>> static bool rk808_is_volatile_reg(struct device *dev, unsigned >>>> int reg) >>>> { ->>>> @@ -57,6 +56,14 @@ static bool rk808=5Fis=5Fvolatile=5Freg(struct devi= -ce +>>>> @@ -57,6 +56,14 @@ static bool rk808_is_volatile_reg(struct device >>>> *dev, unsigned int reg) >>>> return false; >>>> } ->>>> +static const struct regmap=5Fconfig rk818=5Fregmap=5Fconfig =3D { ->>>> + .reg=5Fbits =3D 8, ->>>> + .val=5Fbits =3D 8, ->>>> + .max=5Fregister =3D RK818=5FUSB=5FCTRL=5FREG, ->>>> + .cache=5Ftype =3D REGCACHE=5FRBTREE, ->>>> + .volatile=5Freg =3D rk808=5Fis=5Fvolatile=5Freg, +>>>> +static const struct regmap_config rk818_regmap_config = { +>>>> + .reg_bits = 8, +>>>> + .val_bits = 8, +>>>> + .max_register = RK818_USB_CTRL_REG, +>>>> + .cache_type = REGCACHE_RBTREE, +>>>> + .volatile_reg = rk808_is_volatile_reg, >>>> +}; >>>> + ->>>> static const struct regmap=5Fconfig rk808=5Fregmap=5Fconfig =3D { ->>>> .reg=5Fbits =3D 8, ->>>> .val=5Fbits =3D 8, ->>>> @@ -83,7 +90,17 @@ static const struct mfd=5Fcell rk808s[] =3D { +>>>> static const struct regmap_config rk808_regmap_config = { +>>>> .reg_bits = 8, +>>>> .val_bits = 8, +>>>> @@ -83,7 +90,17 @@ static const struct mfd_cell rk808s[] = { >>>> }, >>>> }; ->>>> -static const struct rk808=5Freg=5Fdata pre=5Finit=5Freg[] =3D { ->>>> +static const struct mfd=5Fcell rk818s[] =3D { ->>>> + { .name =3D "rk808-clkout", }, +>>>> -static const struct rk808_reg_data pre_init_reg[] = { +>>>> +static const struct mfd_cell rk818s[] = { +>>>> + { .name = "rk808-clkout", }, >>> How does this differ to a normal -clock driver? >> I don't know. It is a normal clock driver. >> ->>>> + { .name =3D "rk808-regulator", }, +>>>> + { .name = "rk808-regulator", }, >>>> + { ->>>> + .name =3D "rk808-rtc", ->>>> + .num=5Fresources =3D ARRAY=5FSIZE(rtc=5Fresources), ->>>> + .resources =3D &rtc=5Fresources[0], ->>> .resources =3D rtc=5Fresources, ? +>>>> + .name = "rk808-rtc", +>>>> + .num_resources = ARRAY_SIZE(rtc_resources), +>>>> + .resources = &rtc_resources[0], +>>> .resources = rtc_resources, ? >>> >>>> + }, >>>> +}; >>>> + ->>>> +static const struct rk8xx=5Freg=5Fdata rk808=5Fpre=5Finit=5Freg[] =3D= - { ->>>> { RK808=5FBUCK3=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FILM= -IN=5F150MA }, ->>>> { RK808=5FBUCK4=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FILM= -IN=5F200MA }, ->>>> { RK808=5FBOOST=5FCONFIG=5FREG, BOOST=5FILMIN=5FMASK, BOOST=5FIL= -MIN=5F100MA }, ->>>> @@ -94,6 +111,22 @@ static const struct rk808=5Freg=5Fdata ->>>> pre=5Finit=5Freg[] =3D { ->>>> VB=5FLO=5FSEL=5F3500MV }, +>>>> +static const struct rk8xx_reg_data rk808_pre_init_reg[] = { +>>>> { RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_150MA }, +>>>> { RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_200MA }, +>>>> { RK808_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA }, +>>>> @@ -94,6 +111,22 @@ static const struct rk808_reg_data +>>>> pre_init_reg[] = { +>>>> VB_LO_SEL_3500MV }, >>>> }; ->>>> +static const struct rk8xx=5Freg=5Fdata rk818=5Fpre=5Finit=5Freg[] = -=3D { ->>>> + { RK818=5FUSB=5FCTRL=5FREG, RK818=5FUSB=5FILIM=5FSEL=5FMASK, ->>>> + RK818=5FUSB=5FILMIN=5F2000MA }, +>>>> +static const struct rk8xx_reg_data rk818_pre_init_reg[] = { +>>>> + { RK818_USB_CTRL_REG, RK818_USB_ILIM_SEL_MASK, +>>>> + RK818_USB_ILMIN_2000MA }, >>>> + /* close charger when usb lower then 3.4V */ ->>>> + { RK818=5FUSB=5FCTRL=5FREG, RK818=5FUSB=5FCHG=5FSD=5FVSEL=5FMA= -SK, (0x7 << +>>>> + { RK818_USB_CTRL_REG, RK818_USB_CHG_SD_VSEL_MASK, (0x7 << >>>> 4) }, >>>> + /* no action when vref */ ->>>> + { RK818=5FH5V=5FEN=5FREG, BIT(1), RK818=5FREF=5FRDY=5FC= -TRL }, +>>>> + { RK818_H5V_EN_REG, BIT(1), RK818_REF_RDY_CTRL }, >>>> + /* enable HDMI 5V */ ->>>> + { RK818=5FH5V=5FEN=5FREG, BIT(0), RK818=5FH5V=5FEN }, +>>>> + { RK818_H5V_EN_REG, BIT(0), RK818_H5V_EN }, >>>> + /* improve efficiency */ ->>>> + { RK818=5FBUCK2=5FCONFIG=5FREG, BUCK2=5FRATE=5FMASK, BUCK=5FIL= -MIN=5F250MA }, ->>>> + { RK818=5FBUCK4=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FIL= -MIN=5F250MA }, ->>>> + { RK818=5FBOOST=5FCONFIG=5FREG, BOOST=5FILMIN=5FMASK, =20 ->>>> BOOST=5FILMIN=5F100MA }, ->>>> + { RK808=5FVB=5FMON=5FREG, MASK=5FALL, VB=5FLO=5FACT | ->>>> VB=5FLO=5FSEL=5F3500MV }, +>>>> + { RK818_BUCK2_CONFIG_REG, BUCK2_RATE_MASK, BUCK_ILMIN_250MA }, +>>>> + { RK818_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_250MA }, +>>>> + { RK818_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, +>>>> BOOST_ILMIN_100MA }, +>>>> + { RK808_VB_MON_REG, MASK_ALL, VB_LO_ACT | +>>>> VB_LO_SEL_3500MV }, >>>> +}; >>> The alignment here looks odd. >> I will fix it in the next version. >> ->>>> static const struct regmap=5Firq rk808=5Firqs[] =3D { ->>>> /* INT=5FSTS */ ->>>> [RK808=5FIRQ=5FVOUT=5FLO] =3D { ->>>> @@ -136,6 +169,76 @@ static const struct regmap=5Firq rk808=5Firqs[] = -=3D { +>>>> static const struct regmap_irq rk808_irqs[] = { +>>>> /* INT_STS */ +>>>> [RK808_IRQ_VOUT_LO] = { +>>>> @@ -136,6 +169,76 @@ static const struct regmap_irq rk808_irqs[] = { >>>> }, >>>> }; ->>>> +static const struct regmap=5Firq rk818=5Firqs[] =3D { ->>>> + /* INT=5FSTS */ ->>>> + [RK818=5FIRQ=5FVOUT=5FLO] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FVOUT=5FLO=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> +static const struct regmap_irq rk818_irqs[] = { +>>>> + /* INT_STS */ +>>>> + [RK818_IRQ_VOUT_LO] = { +>>>> + .mask = RK818_IRQ_VOUT_LO_MSK, +>>>> + .reg_offset = 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FVB=5FLO] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FVB=5FLO=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_VB_LO] = { +>>>> + .mask = RK818_IRQ_VB_LO_MSK, +>>>> + .reg_offset = 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FPWRON] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FPWRON=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_PWRON] = { +>>>> + .mask = RK818_IRQ_PWRON_MSK, +>>>> + .reg_offset = 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FPWRON=5FLP] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FPWRON=5FLP=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_PWRON_LP] = { +>>>> + .mask = RK818_IRQ_PWRON_LP_MSK, +>>>> + .reg_offset = 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FHOTDIE] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FHOTDIE=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_HOTDIE] = { +>>>> + .mask = RK818_IRQ_HOTDIE_MSK, +>>>> + .reg_offset = 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FRTC=5FALARM] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FRTC=5FALARM=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_RTC_ALARM] = { +>>>> + .mask = RK818_IRQ_RTC_ALARM_MSK, +>>>> + .reg_offset = 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FRTC=5FPERIOD] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FRTC=5FPERIOD=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_RTC_PERIOD] = { +>>>> + .mask = RK818_IRQ_RTC_PERIOD_MSK, +>>>> + .reg_offset = 0, >>>> + }, ->>>> + [RK818=5FIRQ=5FUSB=5FOV] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FUSB=5FOV=5FMSK, ->>>> + .reg=5Foffset =3D 0, +>>>> + [RK818_IRQ_USB_OV] = { +>>>> + .mask = RK818_IRQ_USB_OV_MSK, +>>>> + .reg_offset = 0, >>>> + }, >>>> + ->>>> + /* INT=5FSTS2 */ ->>>> + [RK818=5FIRQ=5FPLUG=5FIN] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FPLUG=5FIN=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + /* INT_STS2 */ +>>>> + [RK818_IRQ_PLUG_IN] = { +>>>> + .mask = RK818_IRQ_PLUG_IN_MSK, +>>>> + .reg_offset = 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FPLUG=5FOUT] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FPLUG=5FOUT=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_PLUG_OUT] = { +>>>> + .mask = RK818_IRQ_PLUG_OUT_MSK, +>>>> + .reg_offset = 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FCHG=5FOK] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FCHG=5FOK=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_CHG_OK] = { +>>>> + .mask = RK818_IRQ_CHG_OK_MSK, +>>>> + .reg_offset = 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FCHG=5FTE] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FCHG=5FTE=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_CHG_TE] = { +>>>> + .mask = RK818_IRQ_CHG_TE_MSK, +>>>> + .reg_offset = 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FCHG=5FTS1] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FCHG=5FTS1=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_CHG_TS1] = { +>>>> + .mask = RK818_IRQ_CHG_TS1_MSK, +>>>> + .reg_offset = 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FTS2] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FTS2=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_TS2] = { +>>>> + .mask = RK818_IRQ_TS2_MSK, +>>>> + .reg_offset = 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FCHG=5FCVTLIM] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FCHG=5FCVTLIM=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_CHG_CVTLIM] = { +>>>> + .mask = RK818_IRQ_CHG_CVTLIM_MSK, +>>>> + .reg_offset = 1, >>>> + }, ->>>> + [RK818=5FIRQ=5FDISCHG=5FILIM] =3D { ->>>> + .mask =3D RK818=5FIRQ=5FDISCHG=5FILIM=5FMSK, ->>>> + .reg=5Foffset =3D 1, +>>>> + [RK818_IRQ_DISCHG_ILIM] = { +>>>> + .mask = RK818_IRQ_DISCHG_ILIM_MSK, +>>>> + .reg_offset = 1, >>>> + }, >>>> +}; >>>> + ->>>> static struct regmap=5Firq=5Fchip rk808=5Firq=5Fchip =3D { ->>>> .name =3D "rk808", ->>>> .irqs =3D rk808=5Firqs, ->>>> @@ -148,6 +251,18 @@ static struct regmap=5Firq=5Fchip rk808=5Firq=5Fc= -hip =3D { ->>>> .init=5Fack=5Fmasked =3D true, +>>>> static struct regmap_irq_chip rk808_irq_chip = { +>>>> .name = "rk808", +>>>> .irqs = rk808_irqs, +>>>> @@ -148,6 +251,18 @@ static struct regmap_irq_chip rk808_irq_chip = { +>>>> .init_ack_masked = true, >>>> }; ->>>> +static struct regmap=5Firq=5Fchip rk818=5Firq=5Fchip =3D { ->>>> + .name =3D "rk818", ->>>> + .irqs =3D rk818=5Firqs, ->>>> + .num=5Firqs =3D ARRAY=5FSIZE(rk818=5Firqs), ->>>> + .num=5Fregs =3D 2, ->>>> + .irq=5Freg=5Fstride =3D 2, ->>>> + .status=5Fbase =3D RK818=5FINT=5FSTS=5FREG1, ->>>> + .mask=5Fbase =3D RK818=5FINT=5FSTS=5FMSK=5FREG1, ->>>> + .ack=5Fbase =3D RK818=5FINT=5FSTS=5FREG1, ->>>> + .init=5Fack=5Fmasked =3D true, +>>>> +static struct regmap_irq_chip rk818_irq_chip = { +>>>> + .name = "rk818", +>>>> + .irqs = rk818_irqs, +>>>> + .num_irqs = ARRAY_SIZE(rk818_irqs), +>>>> + .num_regs = 2, +>>>> + .irq_reg_stride = 2, +>>>> + .status_base = RK818_INT_STS_REG1, +>>>> + .mask_base = RK818_INT_STS_MSK_REG1, +>>>> + .ack_base = RK818_INT_STS_REG1, +>>>> + .init_ack_masked = true, >>>> +}; >>>> + ->>>> static struct i2c=5Fclient *rk808=5Fi2c=5Fclient; ->>>> static void rk808=5Fdevice=5Fshutdown(void) +>>>> static struct i2c_client *rk808_i2c_client; +>>>> static void rk808_device_shutdown(void) >>>> { ->>>> @@ -167,6 +282,48 @@ static void rk808=5Fdevice=5Fshutdown(void) ->>>> dev=5Ferr(&rk808=5Fi2c=5Fclient->dev, "power off error!\n"); +>>>> @@ -167,6 +282,48 @@ static void rk808_device_shutdown(void) +>>>> dev_err(&rk808_i2c_client->dev, "power off error!\n"); >>>> } ->>>> +static const struct of=5Fdevice=5Fid rk808=5Fof=5Fmatch[] =3D { ->>>> + { .compatible =3D "rockchip,rk808", .data =3D (void *) RK808=5FID= - }, ->>>> + { .compatible =3D "rockchip,rk818", .data =3D (void *) RK818=5FID= - }, +>>>> +static const struct of_device_id rk808_of_match[] = { +>>>> + { .compatible = "rockchip,rk808", .data = (void *) RK808_ID }, +>>>> + { .compatible = "rockchip,rk818", .data = (void *) RK818_ID }, >>>> + { }, >>>> +}; ->>>> +MODULE=5FDEVICE=5FTABLE(of, rk808=5Fof=5Fmatch); +>>>> +MODULE_DEVICE_TABLE(of, rk808_of_match); >>>> + ->>>> +static int rk8xx=5Fmatch=5Fdevice(struct rk808 *rk808, struct device +>>>> +static int rk8xx_match_device(struct rk808 *rk808, struct device >>>> *dev) >>> If you're going to do it this way, please switch these parameters. >>> @@ -290,61 +275,57 @@ hip =3D { >> If it's more common I will return a pointer to rk808. >> >>>> +{ ->>>> + const struct of=5Fdevice=5Fid *of=5Fid; +>>>> + const struct of_device_id *of_id; >>>> + ->>>> + of=5Fid =3D of=5Fmatch=5Fdevice(rk808=5Fof=5Fmatch, dev); ->>>> + if (!of=5Fid) { ->>>> + dev=5Ferr(dev, "Unable to match OF ID\n"); +>>>> + of_id = of_match_device(rk808_of_match, dev); +>>>> + if (!of_id) { +>>>> + dev_err(dev, "Unable to match OF ID\n"); >>>> + return -ENODEV; >>>> + } ->>>> + rk808->variant =3D (long) of=5Fid->data; +>>>> + rk808->variant = (long) of_id->data; >>>> + >>>> + switch (rk808->variant) { ->>>> + case RK808=5FID: ->>>> + rk808->nr=5Fcells =3D ARRAY=5FSIZE(rk808s); ->>>> + rk808->cells =3D rk808s; ->>>> + rk808->regmap=5Fcfg =3D &rk808=5Fregmap=5Fconfig; ->>>> + rk808->regmap=5Firq=5Fchip =3D &rk808=5Firq=5Fchip; ->>>> + rk808->pre=5Finit=5Freg =3D rk808=5Fpre=5Finit=5Freg; ->>>> + rk808->nr=5Fpre=5Finit=5Fregs =3D ARRAY=5FSIZE(rk808=5Fpre=5F= -init=5Freg); +>>>> + case RK808_ID: +>>>> + rk808->nr_cells = ARRAY_SIZE(rk808s); +>>>> + rk808->cells = rk808s; +>>>> + rk808->regmap_cfg = &rk808_regmap_config; +>>>> + rk808->regmap_irq_chip = &rk808_irq_chip; +>>>> + rk808->pre_init_reg = rk808_pre_init_reg; +>>>> + rk808->nr_pre_init_regs = ARRAY_SIZE(rk808_pre_init_reg); >>>> + break; ->>>> + case RK818=5FID: ->>>> + rk808->nr=5Fcells =3D ARRAY=5FSIZE(rk818s); ->>>> + rk808->cells =3D rk818s; ->>>> + rk808->regmap=5Fcfg =3D &rk818=5Fregmap=5Fconfig; ->>>> + rk808->regmap=5Firq=5Fchip =3D &rk818=5Firq=5Fchip; ->>>> + rk808->pre=5Finit=5Freg =3D rk818=5Fpre=5Finit=5Freg; ->>>> + rk808->nr=5Fpre=5Finit=5Fregs =3D ARRAY=5FSIZE(rk818=5Fpre=5F= -init=5Freg); +>>>> + case RK818_ID: +>>>> + rk808->nr_cells = ARRAY_SIZE(rk818s); +>>>> + rk808->cells = rk818s; +>>>> + rk808->regmap_cfg = &rk818_regmap_config; +>>>> + rk808->regmap_irq_chip = &rk818_irq_chip; +>>>> + rk808->pre_init_reg = rk818_pre_init_reg; +>>>> + rk808->nr_pre_init_regs = ARRAY_SIZE(rk818_pre_init_reg); >>>> + break; >>>> + default: ->>>> + dev=5Ferr(dev, "unsupported RK8XX ID %lu\n", rk808->variant); +>>>> + dev_err(dev, "unsupported RK8XX ID %lu\n", rk808->variant); >>>> + return -EINVAL; >>>> + } >>>> + >>>> + return 0; >>>> +} ->>>> static int rk808=5Fprobe(struct i2c=5Fclient *client, ->>>> const struct i2c=5Fdevice=5Fid *id) +>>>> static int rk808_probe(struct i2c_client *client, +>>>> const struct i2c_device_id *id) >>>> { ->>>> @@ -176,46 +333,52 @@ static int rk808=5Fprobe(struct i2c=5Fclient +>>>> @@ -176,46 +333,52 @@ static int rk808_probe(struct i2c_client >>>> *client, >>>> int ret; >>>> int i; >>>> - if (!client->irq) { ->>>> - dev=5Ferr(&client->dev, "No interrupt support, no core IRQ\n"= -); +>>>> - dev_err(&client->dev, "No interrupt support, no core IRQ\n"); >>>> - return -EINVAL; >>>> - } >>>> - ->>>> rk808 =3D devm=5Fkzalloc(&client->dev, sizeof(*rk808), GFP=5FKER= -NEL); +>>>> rk808 = devm_kzalloc(&client->dev, sizeof(*rk808), GFP_KERNEL); >>>> if (!rk808) >>>> return -ENOMEM; ->>>> - rk808->regmap =3D devm=5Fregmap=5Finit=5Fi2c(client, ->>>> &rk808=5Fregmap=5Fconfig); ->>>> + ret =3D rk8xx=5Fmatch=5Fdevice(rk808, &client->dev); +>>>> - rk808->regmap = devm_regmap_init_i2c(client, +>>>> &rk808_regmap_config); +>>>> + ret = rk8xx_match_device(rk808, &client->dev); >>> Is there a way to dynamically probe the device? No device ID you can >>> read directly from the silicon? >> AFAIK there is no device ID register. At least it is not documented in diff --git a/a/content_digest b/N3/content_digest index 568572d..54ec79f 100644 --- a/a/content_digest +++ b/N3/content_digest @@ -32,7 +32,7 @@ "On 06.07.2016 05:15, Andy Yan wrote:\n" "> Hi Wadim:\n" ">\n" - "> On 2016=E5=B9=B406=E6=9C=8809=E6=97=A5 16:23, Wadim Egorov wrote:\n" + "> On 2016\345\271\26406\346\234\21009\346\227\245 16:23, Wadim Egorov wrote:\n" ">> Hi,\n" ">>\n" ">> On 08.06.2016 16:17, Lee Jones wrote:\n" @@ -69,17 +69,17 @@ ">>>> index 1bcf601..7ba464b 100644\n" ">>>> --- a/drivers/mfd/Kconfig\n" ">>>> +++ b/drivers/mfd/Kconfig\n" - ">>>> @@ -839,13 +839,13 @@ config MFD=5FRC5T583\n" + ">>>> @@ -839,13 +839,13 @@ config MFD_RC5T583\n" ">>>> different functionality of the device.\n" - ">>>> config MFD=5FRK808\n" + ">>>> config MFD_RK808\n" ">>>> - tristate \"Rockchip RK808 Power Management chip\"\n" ">>>> + tristate \"Rockchip RK808/RK818 Power Management chip\"\n" ">>> \"Chip\"\n" ">>>\n" ">>>> depends on I2C && OF\n" - ">>>> select MFD=5FCORE\n" - ">>>> select REGMAP=5FI2C\n" - ">>>> select REGMAP=5FIRQ\n" + ">>>> select MFD_CORE\n" + ">>>> select REGMAP_I2C\n" + ">>>> select REGMAP_IRQ\n" ">>>> help\n" ">>>> - If you say yes here you get support for the RK808\n" ">>>> + If you say yes here you get support for the RK808 and RK818\n" @@ -114,7 +114,7 @@ ">>>> #include <linux/module.h>\n" ">>>> #include <linux/regmap.h>\n" ">>>> -\n" - ">>>> -struct rk808=5Freg=5Fdata {\n" + ">>>> -struct rk808_reg_data {\n" ">>>> - int addr;\n" ">>>> - int mask;\n" ">>>> - int value;\n" @@ -122,196 +122,181 @@ ">>> Why are you moving this to the header?\n" ">> It is now part of the rk808 struct.\n" ">>\n" - ">>>> +#include <linux/of=5Fdevice.h>\n" - ">>>> static bool rk808=5Fis=5Fvolatile=5Freg(struct device *dev, unsign=\n" - "ed\n" + ">>>> +#include <linux/of_device.h>\n" + ">>>> static bool rk808_is_volatile_reg(struct device *dev, unsigned\n" ">>>> int reg)\n" ">>>> {\n" - ">>>> @@ -57,6 +56,14 @@ static bool rk808=5Fis=5Fvolatile=5Freg(struct devi=\n" - "ce\n" + ">>>> @@ -57,6 +56,14 @@ static bool rk808_is_volatile_reg(struct device\n" ">>>> *dev, unsigned int reg)\n" ">>>> return false;\n" ">>>> }\n" - ">>>> +static const struct regmap=5Fconfig rk818=5Fregmap=5Fconfig =3D {\n" - ">>>> + .reg=5Fbits =3D 8,\n" - ">>>> + .val=5Fbits =3D 8,\n" - ">>>> + .max=5Fregister =3D RK818=5FUSB=5FCTRL=5FREG,\n" - ">>>> + .cache=5Ftype =3D REGCACHE=5FRBTREE,\n" - ">>>> + .volatile=5Freg =3D rk808=5Fis=5Fvolatile=5Freg,\n" + ">>>> +static const struct regmap_config rk818_regmap_config = {\n" + ">>>> + .reg_bits = 8,\n" + ">>>> + .val_bits = 8,\n" + ">>>> + .max_register = RK818_USB_CTRL_REG,\n" + ">>>> + .cache_type = REGCACHE_RBTREE,\n" + ">>>> + .volatile_reg = rk808_is_volatile_reg,\n" ">>>> +};\n" ">>>> +\n" - ">>>> static const struct regmap=5Fconfig rk808=5Fregmap=5Fconfig =3D {\n" - ">>>> .reg=5Fbits =3D 8,\n" - ">>>> .val=5Fbits =3D 8,\n" - ">>>> @@ -83,7 +90,17 @@ static const struct mfd=5Fcell rk808s[] =3D {\n" + ">>>> static const struct regmap_config rk808_regmap_config = {\n" + ">>>> .reg_bits = 8,\n" + ">>>> .val_bits = 8,\n" + ">>>> @@ -83,7 +90,17 @@ static const struct mfd_cell rk808s[] = {\n" ">>>> },\n" ">>>> };\n" - ">>>> -static const struct rk808=5Freg=5Fdata pre=5Finit=5Freg[] =3D {\n" - ">>>> +static const struct mfd=5Fcell rk818s[] =3D {\n" - ">>>> + { .name =3D \"rk808-clkout\", },\n" + ">>>> -static const struct rk808_reg_data pre_init_reg[] = {\n" + ">>>> +static const struct mfd_cell rk818s[] = {\n" + ">>>> + { .name = \"rk808-clkout\", },\n" ">>> How does this differ to a normal -clock driver?\n" ">> I don't know. It is a normal clock driver.\n" ">>\n" - ">>>> + { .name =3D \"rk808-regulator\", },\n" + ">>>> + { .name = \"rk808-regulator\", },\n" ">>>> + {\n" - ">>>> + .name =3D \"rk808-rtc\",\n" - ">>>> + .num=5Fresources =3D ARRAY=5FSIZE(rtc=5Fresources),\n" - ">>>> + .resources =3D &rtc=5Fresources[0],\n" - ">>> .resources =3D rtc=5Fresources, ?\n" + ">>>> + .name = \"rk808-rtc\",\n" + ">>>> + .num_resources = ARRAY_SIZE(rtc_resources),\n" + ">>>> + .resources = &rtc_resources[0],\n" + ">>> .resources = rtc_resources, ?\n" ">>>\n" ">>>> + },\n" ">>>> +};\n" ">>>> +\n" - ">>>> +static const struct rk8xx=5Freg=5Fdata rk808=5Fpre=5Finit=5Freg[] =3D=\n" - " {\n" - ">>>> { RK808=5FBUCK3=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FILM=\n" - "IN=5F150MA },\n" - ">>>> { RK808=5FBUCK4=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FILM=\n" - "IN=5F200MA },\n" - ">>>> { RK808=5FBOOST=5FCONFIG=5FREG, BOOST=5FILMIN=5FMASK, BOOST=5FIL=\n" - "MIN=5F100MA },\n" - ">>>> @@ -94,6 +111,22 @@ static const struct rk808=5Freg=5Fdata\n" - ">>>> pre=5Finit=5Freg[] =3D {\n" - ">>>> VB=5FLO=5FSEL=5F3500MV },\n" + ">>>> +static const struct rk8xx_reg_data rk808_pre_init_reg[] = {\n" + ">>>> { RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_150MA },\n" + ">>>> { RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_200MA },\n" + ">>>> { RK808_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },\n" + ">>>> @@ -94,6 +111,22 @@ static const struct rk808_reg_data\n" + ">>>> pre_init_reg[] = {\n" + ">>>> VB_LO_SEL_3500MV },\n" ">>>> };\n" - ">>>> +static const struct rk8xx=5Freg=5Fdata rk818=5Fpre=5Finit=5Freg[] =\n" - "=3D {\n" - ">>>> + { RK818=5FUSB=5FCTRL=5FREG, RK818=5FUSB=5FILIM=5FSEL=5FMASK,\n" - ">>>> + RK818=5FUSB=5FILMIN=5F2000MA },\n" + ">>>> +static const struct rk8xx_reg_data rk818_pre_init_reg[] = {\n" + ">>>> + { RK818_USB_CTRL_REG, RK818_USB_ILIM_SEL_MASK,\n" + ">>>> + RK818_USB_ILMIN_2000MA },\n" ">>>> + /* close charger when usb lower then 3.4V */\n" - ">>>> + { RK818=5FUSB=5FCTRL=5FREG, RK818=5FUSB=5FCHG=5FSD=5FVSEL=5FMA=\n" - "SK, (0x7 <<\n" + ">>>> + { RK818_USB_CTRL_REG, RK818_USB_CHG_SD_VSEL_MASK, (0x7 <<\n" ">>>> 4) },\n" ">>>> + /* no action when vref */\n" - ">>>> + { RK818=5FH5V=5FEN=5FREG, BIT(1), RK818=5FREF=5FRDY=5FC=\n" - "TRL },\n" + ">>>> + { RK818_H5V_EN_REG, BIT(1), RK818_REF_RDY_CTRL },\n" ">>>> + /* enable HDMI 5V */\n" - ">>>> + { RK818=5FH5V=5FEN=5FREG, BIT(0), RK818=5FH5V=5FEN },\n" + ">>>> + { RK818_H5V_EN_REG, BIT(0), RK818_H5V_EN },\n" ">>>> + /* improve efficiency */\n" - ">>>> + { RK818=5FBUCK2=5FCONFIG=5FREG, BUCK2=5FRATE=5FMASK, BUCK=5FIL=\n" - "MIN=5F250MA },\n" - ">>>> + { RK818=5FBUCK4=5FCONFIG=5FREG, BUCK=5FILMIN=5FMASK, BUCK=5FIL=\n" - "MIN=5F250MA },\n" - ">>>> + { RK818=5FBOOST=5FCONFIG=5FREG, BOOST=5FILMIN=5FMASK, =20\n" - ">>>> BOOST=5FILMIN=5F100MA },\n" - ">>>> + { RK808=5FVB=5FMON=5FREG, MASK=5FALL, VB=5FLO=5FACT |\n" - ">>>> VB=5FLO=5FSEL=5F3500MV },\n" + ">>>> + { RK818_BUCK2_CONFIG_REG, BUCK2_RATE_MASK, BUCK_ILMIN_250MA },\n" + ">>>> + { RK818_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_250MA },\n" + ">>>> + { RK818_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, \n" + ">>>> BOOST_ILMIN_100MA },\n" + ">>>> + { RK808_VB_MON_REG, MASK_ALL, VB_LO_ACT |\n" + ">>>> VB_LO_SEL_3500MV },\n" ">>>> +};\n" ">>> The alignment here looks odd.\n" ">> I will fix it in the next version.\n" ">>\n" - ">>>> static const struct regmap=5Firq rk808=5Firqs[] =3D {\n" - ">>>> /* INT=5FSTS */\n" - ">>>> [RK808=5FIRQ=5FVOUT=5FLO] =3D {\n" - ">>>> @@ -136,6 +169,76 @@ static const struct regmap=5Firq rk808=5Firqs[] =\n" - "=3D {\n" + ">>>> static const struct regmap_irq rk808_irqs[] = {\n" + ">>>> /* INT_STS */\n" + ">>>> [RK808_IRQ_VOUT_LO] = {\n" + ">>>> @@ -136,6 +169,76 @@ static const struct regmap_irq rk808_irqs[] = {\n" ">>>> },\n" ">>>> };\n" - ">>>> +static const struct regmap=5Firq rk818=5Firqs[] =3D {\n" - ">>>> + /* INT=5FSTS */\n" - ">>>> + [RK818=5FIRQ=5FVOUT=5FLO] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FVOUT=5FLO=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> +static const struct regmap_irq rk818_irqs[] = {\n" + ">>>> + /* INT_STS */\n" + ">>>> + [RK818_IRQ_VOUT_LO] = {\n" + ">>>> + .mask = RK818_IRQ_VOUT_LO_MSK,\n" + ">>>> + .reg_offset = 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FVB=5FLO] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FVB=5FLO=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_VB_LO] = {\n" + ">>>> + .mask = RK818_IRQ_VB_LO_MSK,\n" + ">>>> + .reg_offset = 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FPWRON] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FPWRON=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_PWRON] = {\n" + ">>>> + .mask = RK818_IRQ_PWRON_MSK,\n" + ">>>> + .reg_offset = 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FPWRON=5FLP] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FPWRON=5FLP=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_PWRON_LP] = {\n" + ">>>> + .mask = RK818_IRQ_PWRON_LP_MSK,\n" + ">>>> + .reg_offset = 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FHOTDIE] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FHOTDIE=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_HOTDIE] = {\n" + ">>>> + .mask = RK818_IRQ_HOTDIE_MSK,\n" + ">>>> + .reg_offset = 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FRTC=5FALARM] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FRTC=5FALARM=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_RTC_ALARM] = {\n" + ">>>> + .mask = RK818_IRQ_RTC_ALARM_MSK,\n" + ">>>> + .reg_offset = 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FRTC=5FPERIOD] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FRTC=5FPERIOD=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_RTC_PERIOD] = {\n" + ">>>> + .mask = RK818_IRQ_RTC_PERIOD_MSK,\n" + ">>>> + .reg_offset = 0,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FUSB=5FOV] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FUSB=5FOV=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 0,\n" + ">>>> + [RK818_IRQ_USB_OV] = {\n" + ">>>> + .mask = RK818_IRQ_USB_OV_MSK,\n" + ">>>> + .reg_offset = 0,\n" ">>>> + },\n" ">>>> +\n" - ">>>> + /* INT=5FSTS2 */\n" - ">>>> + [RK818=5FIRQ=5FPLUG=5FIN] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FPLUG=5FIN=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + /* INT_STS2 */\n" + ">>>> + [RK818_IRQ_PLUG_IN] = {\n" + ">>>> + .mask = RK818_IRQ_PLUG_IN_MSK,\n" + ">>>> + .reg_offset = 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FPLUG=5FOUT] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FPLUG=5FOUT=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_PLUG_OUT] = {\n" + ">>>> + .mask = RK818_IRQ_PLUG_OUT_MSK,\n" + ">>>> + .reg_offset = 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FCHG=5FOK] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FCHG=5FOK=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_CHG_OK] = {\n" + ">>>> + .mask = RK818_IRQ_CHG_OK_MSK,\n" + ">>>> + .reg_offset = 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FCHG=5FTE] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FCHG=5FTE=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_CHG_TE] = {\n" + ">>>> + .mask = RK818_IRQ_CHG_TE_MSK,\n" + ">>>> + .reg_offset = 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FCHG=5FTS1] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FCHG=5FTS1=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_CHG_TS1] = {\n" + ">>>> + .mask = RK818_IRQ_CHG_TS1_MSK,\n" + ">>>> + .reg_offset = 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FTS2] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FTS2=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_TS2] = {\n" + ">>>> + .mask = RK818_IRQ_TS2_MSK,\n" + ">>>> + .reg_offset = 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FCHG=5FCVTLIM] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FCHG=5FCVTLIM=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_CHG_CVTLIM] = {\n" + ">>>> + .mask = RK818_IRQ_CHG_CVTLIM_MSK,\n" + ">>>> + .reg_offset = 1,\n" ">>>> + },\n" - ">>>> + [RK818=5FIRQ=5FDISCHG=5FILIM] =3D {\n" - ">>>> + .mask =3D RK818=5FIRQ=5FDISCHG=5FILIM=5FMSK,\n" - ">>>> + .reg=5Foffset =3D 1,\n" + ">>>> + [RK818_IRQ_DISCHG_ILIM] = {\n" + ">>>> + .mask = RK818_IRQ_DISCHG_ILIM_MSK,\n" + ">>>> + .reg_offset = 1,\n" ">>>> + },\n" ">>>> +};\n" ">>>> +\n" - ">>>> static struct regmap=5Firq=5Fchip rk808=5Firq=5Fchip =3D {\n" - ">>>> .name =3D \"rk808\",\n" - ">>>> .irqs =3D rk808=5Firqs,\n" - ">>>> @@ -148,6 +251,18 @@ static struct regmap=5Firq=5Fchip rk808=5Firq=5Fc=\n" - "hip =3D {\n" - ">>>> .init=5Fack=5Fmasked =3D true,\n" + ">>>> static struct regmap_irq_chip rk808_irq_chip = {\n" + ">>>> .name = \"rk808\",\n" + ">>>> .irqs = rk808_irqs,\n" + ">>>> @@ -148,6 +251,18 @@ static struct regmap_irq_chip rk808_irq_chip = {\n" + ">>>> .init_ack_masked = true,\n" ">>>> };\n" - ">>>> +static struct regmap=5Firq=5Fchip rk818=5Firq=5Fchip =3D {\n" - ">>>> + .name =3D \"rk818\",\n" - ">>>> + .irqs =3D rk818=5Firqs,\n" - ">>>> + .num=5Firqs =3D ARRAY=5FSIZE(rk818=5Firqs),\n" - ">>>> + .num=5Fregs =3D 2,\n" - ">>>> + .irq=5Freg=5Fstride =3D 2,\n" - ">>>> + .status=5Fbase =3D RK818=5FINT=5FSTS=5FREG1,\n" - ">>>> + .mask=5Fbase =3D RK818=5FINT=5FSTS=5FMSK=5FREG1,\n" - ">>>> + .ack=5Fbase =3D RK818=5FINT=5FSTS=5FREG1,\n" - ">>>> + .init=5Fack=5Fmasked =3D true,\n" + ">>>> +static struct regmap_irq_chip rk818_irq_chip = {\n" + ">>>> + .name = \"rk818\",\n" + ">>>> + .irqs = rk818_irqs,\n" + ">>>> + .num_irqs = ARRAY_SIZE(rk818_irqs),\n" + ">>>> + .num_regs = 2,\n" + ">>>> + .irq_reg_stride = 2,\n" + ">>>> + .status_base = RK818_INT_STS_REG1,\n" + ">>>> + .mask_base = RK818_INT_STS_MSK_REG1,\n" + ">>>> + .ack_base = RK818_INT_STS_REG1,\n" + ">>>> + .init_ack_masked = true,\n" ">>>> +};\n" ">>>> +\n" - ">>>> static struct i2c=5Fclient *rk808=5Fi2c=5Fclient;\n" - ">>>> static void rk808=5Fdevice=5Fshutdown(void)\n" + ">>>> static struct i2c_client *rk808_i2c_client;\n" + ">>>> static void rk808_device_shutdown(void)\n" ">>>> {\n" - ">>>> @@ -167,6 +282,48 @@ static void rk808=5Fdevice=5Fshutdown(void)\n" - ">>>> dev=5Ferr(&rk808=5Fi2c=5Fclient->dev, \"power off error!\\n\");\n" + ">>>> @@ -167,6 +282,48 @@ static void rk808_device_shutdown(void)\n" + ">>>> dev_err(&rk808_i2c_client->dev, \"power off error!\\n\");\n" ">>>> }\n" - ">>>> +static const struct of=5Fdevice=5Fid rk808=5Fof=5Fmatch[] =3D {\n" - ">>>> + { .compatible =3D \"rockchip,rk808\", .data =3D (void *) RK808=5FID=\n" - " },\n" - ">>>> + { .compatible =3D \"rockchip,rk818\", .data =3D (void *) RK818=5FID=\n" - " },\n" + ">>>> +static const struct of_device_id rk808_of_match[] = {\n" + ">>>> + { .compatible = \"rockchip,rk808\", .data = (void *) RK808_ID },\n" + ">>>> + { .compatible = \"rockchip,rk818\", .data = (void *) RK818_ID },\n" ">>>> + { },\n" ">>>> +};\n" - ">>>> +MODULE=5FDEVICE=5FTABLE(of, rk808=5Fof=5Fmatch);\n" + ">>>> +MODULE_DEVICE_TABLE(of, rk808_of_match);\n" ">>>> +\n" - ">>>> +static int rk8xx=5Fmatch=5Fdevice(struct rk808 *rk808, struct device\n" + ">>>> +static int rk8xx_match_device(struct rk808 *rk808, struct device\n" ">>>> *dev)\n" ">>> If you're going to do it this way, please switch these parameters.\n" ">>>\n" @@ -319,61 +304,57 @@ ">> If it's more common I will return a pointer to rk808.\n" ">>\n" ">>>> +{\n" - ">>>> + const struct of=5Fdevice=5Fid *of=5Fid;\n" + ">>>> + const struct of_device_id *of_id;\n" ">>>> +\n" - ">>>> + of=5Fid =3D of=5Fmatch=5Fdevice(rk808=5Fof=5Fmatch, dev);\n" - ">>>> + if (!of=5Fid) {\n" - ">>>> + dev=5Ferr(dev, \"Unable to match OF ID\\n\");\n" + ">>>> + of_id = of_match_device(rk808_of_match, dev);\n" + ">>>> + if (!of_id) {\n" + ">>>> + dev_err(dev, \"Unable to match OF ID\\n\");\n" ">>>> + return -ENODEV;\n" ">>>> + }\n" - ">>>> + rk808->variant =3D (long) of=5Fid->data;\n" + ">>>> + rk808->variant = (long) of_id->data;\n" ">>>> +\n" ">>>> + switch (rk808->variant) {\n" - ">>>> + case RK808=5FID:\n" - ">>>> + rk808->nr=5Fcells =3D ARRAY=5FSIZE(rk808s);\n" - ">>>> + rk808->cells =3D rk808s;\n" - ">>>> + rk808->regmap=5Fcfg =3D &rk808=5Fregmap=5Fconfig;\n" - ">>>> + rk808->regmap=5Firq=5Fchip =3D &rk808=5Firq=5Fchip;\n" - ">>>> + rk808->pre=5Finit=5Freg =3D rk808=5Fpre=5Finit=5Freg;\n" - ">>>> + rk808->nr=5Fpre=5Finit=5Fregs =3D ARRAY=5FSIZE(rk808=5Fpre=5F=\n" - "init=5Freg);\n" + ">>>> + case RK808_ID:\n" + ">>>> + rk808->nr_cells = ARRAY_SIZE(rk808s);\n" + ">>>> + rk808->cells = rk808s;\n" + ">>>> + rk808->regmap_cfg = &rk808_regmap_config;\n" + ">>>> + rk808->regmap_irq_chip = &rk808_irq_chip;\n" + ">>>> + rk808->pre_init_reg = rk808_pre_init_reg;\n" + ">>>> + rk808->nr_pre_init_regs = ARRAY_SIZE(rk808_pre_init_reg);\n" ">>>> + break;\n" - ">>>> + case RK818=5FID:\n" - ">>>> + rk808->nr=5Fcells =3D ARRAY=5FSIZE(rk818s);\n" - ">>>> + rk808->cells =3D rk818s;\n" - ">>>> + rk808->regmap=5Fcfg =3D &rk818=5Fregmap=5Fconfig;\n" - ">>>> + rk808->regmap=5Firq=5Fchip =3D &rk818=5Firq=5Fchip;\n" - ">>>> + rk808->pre=5Finit=5Freg =3D rk818=5Fpre=5Finit=5Freg;\n" - ">>>> + rk808->nr=5Fpre=5Finit=5Fregs =3D ARRAY=5FSIZE(rk818=5Fpre=5F=\n" - "init=5Freg);\n" + ">>>> + case RK818_ID:\n" + ">>>> + rk808->nr_cells = ARRAY_SIZE(rk818s);\n" + ">>>> + rk808->cells = rk818s;\n" + ">>>> + rk808->regmap_cfg = &rk818_regmap_config;\n" + ">>>> + rk808->regmap_irq_chip = &rk818_irq_chip;\n" + ">>>> + rk808->pre_init_reg = rk818_pre_init_reg;\n" + ">>>> + rk808->nr_pre_init_regs = ARRAY_SIZE(rk818_pre_init_reg);\n" ">>>> + break;\n" ">>>> + default:\n" - ">>>> + dev=5Ferr(dev, \"unsupported RK8XX ID %lu\\n\", rk808->variant);\n" + ">>>> + dev_err(dev, \"unsupported RK8XX ID %lu\\n\", rk808->variant);\n" ">>>> + return -EINVAL;\n" ">>>> + }\n" ">>>> +\n" ">>>> + return 0;\n" ">>>> +}\n" - ">>>> static int rk808=5Fprobe(struct i2c=5Fclient *client,\n" - ">>>> const struct i2c=5Fdevice=5Fid *id)\n" + ">>>> static int rk808_probe(struct i2c_client *client,\n" + ">>>> const struct i2c_device_id *id)\n" ">>>> {\n" - ">>>> @@ -176,46 +333,52 @@ static int rk808=5Fprobe(struct i2c=5Fclient\n" + ">>>> @@ -176,46 +333,52 @@ static int rk808_probe(struct i2c_client\n" ">>>> *client,\n" ">>>> int ret;\n" ">>>> int i;\n" ">>>> - if (!client->irq) {\n" - ">>>> - dev=5Ferr(&client->dev, \"No interrupt support, no core IRQ\\n\"=\n" - ");\n" + ">>>> - dev_err(&client->dev, \"No interrupt support, no core IRQ\\n\");\n" ">>>> - return -EINVAL;\n" ">>>> - }\n" ">>>> -\n" - ">>>> rk808 =3D devm=5Fkzalloc(&client->dev, sizeof(*rk808), GFP=5FKER=\n" - "NEL);\n" + ">>>> rk808 = devm_kzalloc(&client->dev, sizeof(*rk808), GFP_KERNEL);\n" ">>>> if (!rk808)\n" ">>>> return -ENOMEM;\n" - ">>>> - rk808->regmap =3D devm=5Fregmap=5Finit=5Fi2c(client,\n" - ">>>> &rk808=5Fregmap=5Fconfig);\n" - ">>>> + ret =3D rk8xx=5Fmatch=5Fdevice(rk808, &client->dev);\n" + ">>>> - rk808->regmap = devm_regmap_init_i2c(client,\n" + ">>>> &rk808_regmap_config);\n" + ">>>> + ret = rk8xx_match_device(rk808, &client->dev);\n" ">>> Is there a way to dynamically probe the device? No device ID you can\n" ">>> read directly from the silicon?\n" ">> AFAIK there is no device ID register. At least it is not documented in\n" @@ -392,4 +373,4 @@ "Do you want me to base my changes on top of this series or send a new\n" version? -e704dad1b9db78dff641b71fa10c12d7ff59a1234c094da3552788182b32011c +1bbebcc4334ceb532c408ef1d0f0055b76066ba266d8e075085a1b08e2ce6b0e
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.