ptp: add kernel API ptp_get_vclocks_index()
Add kernel API ptp_get_vclocks_index() to get all ptp vclocks index on pclock. This is preparation for supporting ptp vclocks info query through ethtool. Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
44c494c8e3
commit
acb288e804
@ -24,10 +24,11 @@
|
|||||||
#define PTP_PPS_EVENT PPS_CAPTUREASSERT
|
#define PTP_PPS_EVENT PPS_CAPTUREASSERT
|
||||||
#define PTP_PPS_MODE (PTP_PPS_DEFAULTS | PPS_CANWAIT | PPS_TSFMT_TSPEC)
|
#define PTP_PPS_MODE (PTP_PPS_DEFAULTS | PPS_CANWAIT | PPS_TSFMT_TSPEC)
|
||||||
|
|
||||||
|
struct class *ptp_class;
|
||||||
|
|
||||||
/* private globals */
|
/* private globals */
|
||||||
|
|
||||||
static dev_t ptp_devt;
|
static dev_t ptp_devt;
|
||||||
static struct class *ptp_class;
|
|
||||||
|
|
||||||
static DEFINE_IDA(ptp_clocks_map);
|
static DEFINE_IDA(ptp_clocks_map);
|
||||||
|
|
||||||
|
@ -96,6 +96,8 @@ static inline bool ptp_vclock_in_use(struct ptp_clock *ptp)
|
|||||||
return in_use;
|
return in_use;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern struct class *ptp_class;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* see ptp_chardev.c
|
* see ptp_chardev.c
|
||||||
*/
|
*/
|
||||||
|
@ -148,3 +148,38 @@ void ptp_vclock_unregister(struct ptp_vclock *vclock)
|
|||||||
ptp_clock_unregister(vclock->clock);
|
ptp_clock_unregister(vclock->clock);
|
||||||
kfree(vclock);
|
kfree(vclock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ptp_get_vclocks_index(int pclock_index, int **vclock_index)
|
||||||
|
{
|
||||||
|
char name[PTP_CLOCK_NAME_LEN] = "";
|
||||||
|
struct ptp_clock *ptp;
|
||||||
|
struct device *dev;
|
||||||
|
int num = 0;
|
||||||
|
|
||||||
|
if (pclock_index < 0)
|
||||||
|
return num;
|
||||||
|
|
||||||
|
snprintf(name, PTP_CLOCK_NAME_LEN, "ptp%d", pclock_index);
|
||||||
|
dev = class_find_device_by_name(ptp_class, name);
|
||||||
|
if (!dev)
|
||||||
|
return num;
|
||||||
|
|
||||||
|
ptp = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
if (mutex_lock_interruptible(&ptp->n_vclocks_mux)) {
|
||||||
|
put_device(dev);
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
*vclock_index = kzalloc(sizeof(int) * ptp->n_vclocks, GFP_KERNEL);
|
||||||
|
if (!(*vclock_index))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
memcpy(*vclock_index, ptp->vclock_index, sizeof(int) * ptp->n_vclocks);
|
||||||
|
num = ptp->n_vclocks;
|
||||||
|
out:
|
||||||
|
mutex_unlock(&ptp->n_vclocks_mux);
|
||||||
|
put_device(dev);
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(ptp_get_vclocks_index);
|
||||||
|
@ -306,6 +306,18 @@ int ptp_schedule_worker(struct ptp_clock *ptp, unsigned long delay);
|
|||||||
*/
|
*/
|
||||||
void ptp_cancel_worker_sync(struct ptp_clock *ptp);
|
void ptp_cancel_worker_sync(struct ptp_clock *ptp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ptp_get_vclocks_index() - get all vclocks index on pclock, and
|
||||||
|
* caller is responsible to free memory
|
||||||
|
* of vclock_index
|
||||||
|
*
|
||||||
|
* @pclock_index: phc index of ptp pclock.
|
||||||
|
* @vclock_index: pointer to pointer of vclock index.
|
||||||
|
*
|
||||||
|
* return number of vclocks.
|
||||||
|
*/
|
||||||
|
int ptp_get_vclocks_index(int pclock_index, int **vclock_index);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
static inline struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
|
static inline struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
|
||||||
struct device *parent)
|
struct device *parent)
|
||||||
@ -325,6 +337,8 @@ static inline int ptp_schedule_worker(struct ptp_clock *ptp,
|
|||||||
{ return -EOPNOTSUPP; }
|
{ return -EOPNOTSUPP; }
|
||||||
static inline void ptp_cancel_worker_sync(struct ptp_clock *ptp)
|
static inline void ptp_cancel_worker_sync(struct ptp_clock *ptp)
|
||||||
{ }
|
{ }
|
||||||
|
static inline int ptp_get_vclocks_index(int pclock_index, int **vclock_index)
|
||||||
|
{ return 0; }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user