Message ID | 1579117007-7565-6-git-send-email-Filip.Bozuta@rt-rk.com |
---|---|
State | New |
Headers | show |
Series | linux-user: Add support for real time clock and | expand |
Le 15/01/2020 à 20:36, Filip Bozuta a écrit : > This patch implements functionalities of following ioctls: > > RTC_PLL_GET - Getting PLL correction > > Read the PLL correction for RTCs that support PLL. The PLL correction > is returned in the following structure: > > struct rtc_pll_info { > int pll_ctrl; /* placeholder for fancier control */ > int pll_value; /* get/set correction value */ > int pll_max; /* max +ve (faster) adjustment value */ > int pll_min; /* max -ve (slower) adjustment value */ > int pll_posmult; /* factor for +ve correction */ > int pll_negmult; /* factor for -ve correction */ > long pll_clock; /* base PLL frequency */ > }; > > A pointer to this structure should be passed as the third > ioctl's argument. > > RTC_PLL_SET - Setting PLL correction > > Sets the PLL correction for RTCs that support PLL. The PLL correction > that is set is specified by the rtc_pll_info structure pointed to by > the third ioctl's' argument. > > Implementation notes: > > All ioctls in this patch have a pointer to a structure rtc_pll_info > as their third argument. All elements of this structure are of > type 'int', except the last one that is of type 'long'. That is > the reason why a separate target structure (target_rtc_pll_info) > is defined in linux-user/syscall_defs. The rest of the > implementation is straightforward. > > Reviewed-by: Laurent Vivier <laurent@vivier.eu> > Signed-off-by: Filip Bozuta <Filip.Bozuta@rt-rk.com> > --- > linux-user/ioctls.h | 2 ++ > linux-user/syscall_defs.h | 14 ++++++++++++++ > linux-user/syscall_types.h | 9 +++++++++ > 3 files changed, 25 insertions(+) > > diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h > index b09396e..0a4e3f1 100644 > --- a/linux-user/ioctls.h > +++ b/linux-user/ioctls.h > @@ -87,6 +87,8 @@ > IOCTL(RTC_EPOCH_SET, IOC_W, TYPE_ULONG) > IOCTL(RTC_WKALM_RD, IOC_R, MK_PTR(MK_STRUCT(STRUCT_rtc_wkalrm))) > IOCTL(RTC_WKALM_SET, IOC_W, MK_PTR(MK_STRUCT(STRUCT_rtc_wkalrm))) > + IOCTL(RTC_PLL_GET, IOC_R, MK_PTR(MK_STRUCT(STRUCT_rtc_pll_info))) > + IOCTL(RTC_PLL_SET, IOC_W, MK_PTR(MK_STRUCT(STRUCT_rtc_pll_info))) > > IOCTL(BLKROSET, IOC_W, MK_PTR(TYPE_INT)) > IOCTL(BLKROGET, IOC_R, MK_PTR(TYPE_INT)) > diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h > index 37504a2..8370f41 100644 > --- a/linux-user/syscall_defs.h > +++ b/linux-user/syscall_defs.h > @@ -763,6 +763,16 @@ struct target_pollfd { > #define TARGET_KDSETLED 0x4B32 /* set led state [lights, not flags] */ > #define TARGET_KDSIGACCEPT 0x4B4E > > +struct target_rtc_pll_info { > + int pll_ctrl; > + int pll_value; > + int pll_max; > + int pll_min; > + int pll_posmult; > + int pll_negmult; > + abi_long pll_clock; > +}; > + > /* real time clock ioctls */ > #define TARGET_RTC_AIE_ON TARGET_IO('p', 0x01) > #define TARGET_RTC_AIE_OFF TARGET_IO('p', 0x02) > @@ -782,6 +792,10 @@ struct target_pollfd { > #define TARGET_RTC_EPOCH_SET TARGET_IOW('p', 0x0e, abi_ulong) > #define TARGET_RTC_WKALM_RD TARGET_IOR('p', 0x10, struct rtc_wkalrm) > #define TARGET_RTC_WKALM_SET TARGET_IOW('p', 0x0f, struct rtc_wkalrm) > +#define TARGET_RTC_PLL_GET TARGET_IOR('p', 0x11, \ > + struct target_rtc_pll_info) > +#define TARGET_RTC_PLL_SET TARGET_IOW('p', 0x12, \ > + struct target_rtc_pll_info) > > #if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_SH4) || \ > defined(TARGET_XTENSA) > diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h > index 820bc8e..4027272 100644 > --- a/linux-user/syscall_types.h > +++ b/linux-user/syscall_types.h > @@ -271,6 +271,15 @@ STRUCT(rtc_wkalrm, > TYPE_CHAR, /* pending */ > MK_STRUCT(STRUCT_rtc_time)) /* time */ > > +STRUCT(rtc_pll_info, > + TYPE_INT, /* pll_ctrl */ > + TYPE_INT, /* pll_value */ > + TYPE_INT, /* pll_max */ > + TYPE_INT, /* pll_min */ > + TYPE_INT, /* pll_posmult */ > + TYPE_INT, /* pll_negmult */ > + TYPE_LONG) /* pll_clock */ > + > STRUCT(blkpg_ioctl_arg, > TYPE_INT, /* op */ > TYPE_INT, /* flags */ > Applied to my linux-user branch. Thanks, Laurent
diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h index b09396e..0a4e3f1 100644 --- a/linux-user/ioctls.h +++ b/linux-user/ioctls.h @@ -87,6 +87,8 @@ IOCTL(RTC_EPOCH_SET, IOC_W, TYPE_ULONG) IOCTL(RTC_WKALM_RD, IOC_R, MK_PTR(MK_STRUCT(STRUCT_rtc_wkalrm))) IOCTL(RTC_WKALM_SET, IOC_W, MK_PTR(MK_STRUCT(STRUCT_rtc_wkalrm))) + IOCTL(RTC_PLL_GET, IOC_R, MK_PTR(MK_STRUCT(STRUCT_rtc_pll_info))) + IOCTL(RTC_PLL_SET, IOC_W, MK_PTR(MK_STRUCT(STRUCT_rtc_pll_info))) IOCTL(BLKROSET, IOC_W, MK_PTR(TYPE_INT)) IOCTL(BLKROGET, IOC_R, MK_PTR(TYPE_INT)) diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index 37504a2..8370f41 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -763,6 +763,16 @@ struct target_pollfd { #define TARGET_KDSETLED 0x4B32 /* set led state [lights, not flags] */ #define TARGET_KDSIGACCEPT 0x4B4E +struct target_rtc_pll_info { + int pll_ctrl; + int pll_value; + int pll_max; + int pll_min; + int pll_posmult; + int pll_negmult; + abi_long pll_clock; +}; + /* real time clock ioctls */ #define TARGET_RTC_AIE_ON TARGET_IO('p', 0x01) #define TARGET_RTC_AIE_OFF TARGET_IO('p', 0x02) @@ -782,6 +792,10 @@ struct target_pollfd { #define TARGET_RTC_EPOCH_SET TARGET_IOW('p', 0x0e, abi_ulong) #define TARGET_RTC_WKALM_RD TARGET_IOR('p', 0x10, struct rtc_wkalrm) #define TARGET_RTC_WKALM_SET TARGET_IOW('p', 0x0f, struct rtc_wkalrm) +#define TARGET_RTC_PLL_GET TARGET_IOR('p', 0x11, \ + struct target_rtc_pll_info) +#define TARGET_RTC_PLL_SET TARGET_IOW('p', 0x12, \ + struct target_rtc_pll_info) #if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_SH4) || \ defined(TARGET_XTENSA) diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h index 820bc8e..4027272 100644 --- a/linux-user/syscall_types.h +++ b/linux-user/syscall_types.h @@ -271,6 +271,15 @@ STRUCT(rtc_wkalrm, TYPE_CHAR, /* pending */ MK_STRUCT(STRUCT_rtc_time)) /* time */ +STRUCT(rtc_pll_info, + TYPE_INT, /* pll_ctrl */ + TYPE_INT, /* pll_value */ + TYPE_INT, /* pll_max */ + TYPE_INT, /* pll_min */ + TYPE_INT, /* pll_posmult */ + TYPE_INT, /* pll_negmult */ + TYPE_LONG) /* pll_clock */ + STRUCT(blkpg_ioctl_arg, TYPE_INT, /* op */ TYPE_INT, /* flags */