mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
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_MODE (PTP_PPS_DEFAULTS | PPS_CANWAIT | PPS_TSFMT_TSPEC)
|
||||
|
||||
struct class *ptp_class;
|
||||
|
||||
/* private globals */
|
||||
|
||||
static dev_t ptp_devt;
|
||||
static struct class *ptp_class;
|
||||
|
||||
static DEFINE_IDA(ptp_clocks_map);
|
||||
|
||||
|
@ -96,6 +96,8 @@ static inline bool ptp_vclock_in_use(struct ptp_clock *ptp)
|
||||
return in_use;
|
||||
}
|
||||
|
||||
extern struct class *ptp_class;
|
||||
|
||||
/*
|
||||
* see ptp_chardev.c
|
||||
*/
|
||||
|
@ -148,3 +148,38 @@ void ptp_vclock_unregister(struct ptp_vclock *vclock)
|
||||
ptp_clock_unregister(vclock->clock);
|
||||
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);
|
||||
|
||||
/**
|
||||
* 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
|
||||
static inline struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
|
||||
struct device *parent)
|
||||
@ -325,6 +337,8 @@ static inline int ptp_schedule_worker(struct ptp_clock *ptp,
|
||||
{ return -EOPNOTSUPP; }
|
||||
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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user